0

Instrumentsは、これはメモリリークであると指摘していますが、適切にリリースする方法や、いつリリースする必要があるのか​​わかりません。ループ内でのみ必要な新しいオブジェクトにプロパティを割り当てるためのより良い規則はありますか?特定の行はexpense.addedDate = [NSDate new];です。

- (void) addObjects:(NSString *)itemDescription withItemAmount:(NSString *)itemAmount {
// Add a new expense to the persistent store.
NSString *expenseDescription = itemDescription;
NSString *expenseAmount = itemAmount;
if (!expenseDescription.length || !expenseAmount.length) {
    UIAlertView *invalidEntry = [[[UIAlertView alloc] initWithTitle:@"Invalid Entry" 
                                                            message:@"You must include a description and cost." 
                                                           delegate:self 
                                                  cancelButtonTitle:@"OK" 
                                                  otherButtonTitles:nil] autorelease];
    [invalidEntry show];
} else {
    Expense *expense = (Expense *)[NSEntityDescription insertNewObjectForEntityForName:@"Expense"
                                                                inManagedObjectContext:self.managedObjectContext];
    expense.addedDate = [NSDate new];
    expense.itemDescription = expenseDescription;
    expense.cost = [NSNumber numberWithInt:[expenseAmount intValue]];

    NSError *error;
    if (![self.managedObjectContext save:&error]) {
        NSLog(@"Error %@", [error localizedDescription]);
        UIAlertView *errorSave = [[[UIAlertView alloc] initWithTitle:@"Unable to Save!" 
                                                            message:@"Money manager was not able to save this entry." 
                                                           delegate:self 
                                                  cancelButtonTitle:@"OK" 
                                                  otherButtonTitles:nil] autorelease];
        [errorSave show];
    } else {
        NSLog(@"Saved Expense to Database.");
    }
}
}
4

2 に答える 2

1

new自動リリースされないので、セレクターは使いたくないと思います。デフォルトの現在のタイムスタンプで自動リリースされたNSDateオブジェクトを探している場合は、次を使用する必要があります。

expense.addedDate = [NSDate date];

記録のために、

[NSObject new]

と同等です

[[NSObject alloc] init]

新しい方法に関するAppleのドキュメント

于 2010-09-09T01:02:40.190 に答える
1

「expense.addedDate」のプロパティをretain(@property(retain))を使用するように宣言する場合、オブジェクトのretainCountは2になるため、後で解放するとメモリリークが発生するため、日付を割り当てないでください。

代わりに、自動解放されたオブジェクトを使用するか、割り当て後にオブジェクトを解放するだけで十分です。

例えば

expense.addedDate = [NSDate date];  // will return an autoreleased object

また

NSDate* dt = [NSDate new];
expense.addedDate = dt;
[dt release];

または第三の道

NSDate* dt = [[NSDate new] autorelease];
于 2010-09-09T01:28:37.877 に答える