Как правильно освободить назначенный объект без дескриптора - PullRequest
0 голосов
/ 09 сентября 2010

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

Ответы [ 2 ]

1 голос
/ 09 сентября 2010

Если вы объявляете свойство «cost.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];
1 голос
/ 09 сентября 2010

Я думаю, что вы не хотите использовать селектор new, так как он не выпускается автоматически.Если вы ищете объект по умолчанию, текущую метку времени, автоматически освобожденный объект NSDate, вы должны использовать:

expense.addedDate = [NSDate date];

Для записи

[NSObject new]

эквивалентно

[[NSObject alloc] init]

Документы Apple по новому методу

...