2010-09-09 57 views
0

工具指出這是內存泄漏,但我不確定如何正確釋放它,或者何時應該釋放它。 是否有一個更好的慣例來分配只有在循環中需要的新對象的屬性?具體行是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."); 
    } 
} 
} 

回答

1

我想你不想使用new選擇器,因爲它不是自動發佈的。如果你正在尋找一個默認情況下,當前時間戳,自動釋放NSDate的對象,你應該使用:

expense.addedDate = [NSDate date]; 

爲了記錄在案,

[NSObject new] 

相當於

[[NSObject alloc] init] 

Apple's docs on the new method

1

如果您聲明「expense.addedDate」屬性使用retain(@property(retain))您不應該像這樣分配日期,因爲該對象的retainCount爲2,稍後在釋放它時會導致memleak。

相反,它足以使用自動釋放對象或分配後釋放該對象。

例如

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

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

或第三種方式

NSDate* dt = [[NSDate new] autorelease]; 
+0

而自動釋放(如此#1或#3)是高度優選的。 – 2012-02-12 15:50:02