Оставшееся имущество освобождается - PullRequest
2 голосов
/ 07 октября 2011

Я довольно новичок в управлении памятью Objective-C и, хотя мне показалось, что я это понял, у меня есть проблема, которую мне не удается решить.

У меня есть это свойство:

@property (nonatomic, retain) NSDate *dateDisplayed;

, который я назначаю в своем viewDidLoad с помощью пользовательского метода:

self.dateDisplayed = [self dbDateFormatToNsDate:@"15/11/2011"];

Мой dbDateFormatToNsDate метод выглядит следующим образом:

- (NSDate *) dbDateFormatToNsDate:(NSString *) date {
    NSDateFormatter *d = [[NSDateFormatter alloc] init];
    [d setDateFormat:@"dd/MM/yyyy"];
    NSDate *toReturn = [d dateFromString:date];
    [d release];
    return toReturn;
}

Таким образом, он возвращает объект с автоматическим освобождением (если NSDate следуетконвенция).Но когда я выхожу из viewDidLoad в другой функции, пытающейся прочитать dateDisplayed:

[dateDisplayed isEqualToDate:[self dbDateFormatToNsDate:@"15/11/2011"]]

, я получаю исключение NSZombie.Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 07 октября 2011

При назначении с помощью self.property свойство сохраняется, потому что вызывается метод установки, но при назначении без использования self. это не так.Предполагая, конечно, что у вас есть retain в правильном определении .h файла.


Вместо этого вы можете [d autorelease];.Я мог бы быть полностью отключен в этом, но toReturn NSDate, возможно, должен был бы держать форматер даже после того, как вы выпустили его, вызывая неправильный доступ:

Попробуйте:

- (NSDate *) dbDateFormatToNsDate:(NSString *) date {
    NSDateFormatter *d = [[NSDateFormatter alloc] init];
    [d setDateFormat:@"dd/MM/yyyy"];
    NSDate *toReturn = [d dateFromString:date];
    [d autorelease];
    return toReturn;
}
0 голосов
/ 07 октября 2011

Поскольку вы возвращаете объект, созданный методом, который не запускается с alloc, copy, mutableCopy, конвенция говорит, что вы должны автоматически выпустить его.Если вызывающему методу необходимо, чтобы он оставался без присмотра, он сохранит его.

Прочтите руководство по управлению памятью:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

Вот правила:

1 и 3 применяются к этому методу.2 относится к вызывающему классу, который может нуждаться в его хранении.

1 - Вы владеете любым создаваемым вами объектом Вы создаете объект, используя метод, имя которого начинается с«Alloc», «new», «copy» или «mutableCopy» (например, alloc, newObject или mutableCopy).

2 - Вы можете стать владельцем объекта, используя команду retain Полученный объект обычно гарантированно остается действительным в методе, в котором он был получен, и этот метод также может безопасно вернуть объект своему вызывающему.Вы используете retain в двух ситуациях: (1) В реализации метода доступа или метода init, чтобы стать владельцем объекта, который вы хотите сохранить как значение свойства;и (2) для предотвращения того, чтобы объект был признан недействительным как побочный эффект какой-либо другой операции (как описано в разделе «Избегайте освобождения от выделения объектов, которые вы используете»).

3 - Когда выВам больше не нужно, вы должны отказаться от владения принадлежащим вам объектом Вы отказываетесь от владения объектом, отправив ему сообщение о выпуске или сообщение об автоматическом выпуске.В терминологии Какао отказ от права собственности на объект, таким образом, обычно называется «освобождением» объекта.

4 - Вы не должны отказываться от владения объектом, которым вы не владеете Это простоследствие предыдущих правил политики, изложенных в явном виде.

...