【问题标题】:How to properly release assigned object with no handle如何正确释放没有句柄的分配对象
【发布时间】:2010-09-09 00:57:18
【问题描述】:

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.");
    }
}
}

【问题讨论】:

    标签: ios objective-c memory-management retain


    【解决方案1】:

    我认为您不想使用new 选择器,因为它不是自动释放的。如果你正在寻找一个默认的、当前的时间戳、自动释放的 NSDate 对象,你应该使用:

    expense.addedDate = [NSDate date];
    

    为了记录,

    [NSObject new]
    

    等价于

    [[NSObject alloc] init]
    

    Apple's docs on the new method

    【讨论】:

      【解决方案2】:

      如果你声明“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];
      

      【讨论】:

      • 自动释放(所以 #1 或 #3)是首选。
      猜你喜欢
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多