Оставшееся имущество освобождается
Я довольно новичок в управлении памятью 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 ответа
При назначении с помощью self.property свойство сохраняется, потому что вызывается метод setter, но при назначении без использования 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;
}
Так как вы возвращаете объект, созданный методом, который не начинается с alloc, copy, mutableCopy, соглашение говорит, что вы должны автоматически освободить его.
Авто-релиз означает, что он будет выпущен в будущем. Если вызывающему методу необходимо, чтобы он оставался без присмотра, то он сохранит его.
Прочитайте руководство по управлению памятью:
Вот правила:
1 и 3 относятся к этому методу. 2 относится к вызывающему классу, который может нуждаться в его удержании.
1 - Вы являетесь владельцем любого создаваемого вами объекта. Вы создаете объект, используя метод, имя которого начинается с "alloc", "new", "copy" или "mutableCopy" (например, alloc, newObject или mutableCopy).
2. Вы можете вступить во владение объектом, используя функцию сохранения. Полученный объект обычно гарантированно остается действительным в рамках метода, в котором он был получен, и этот метод также может безопасно вернуть объект своему вызывающему. Вы используете retain в двух ситуациях: (1) В реализации метода доступа или метода init, чтобы стать владельцем объекта, который вы хотите сохранить как значение свойства; и (2) для предотвращения признания объекта недействительным в качестве побочного эффекта какой-либо другой операции (как описано в разделе "Избегайте выделения ресурсов из используемых вами объектов").
3 - Когда он вам больше не нужен, вы должны отказаться от права собственности на принадлежащий вам объект. Вы отказываетесь от права собственности на объект, отправив ему сообщение о выпуске или сообщение об автоматическом выпуске. Таким образом, в терминологии какао отказ от владения объектом обычно называется "высвобождением" объекта.
4 - Вы не должны отказываться от права собственности на объект, которым вы не владеете. Это всего лишь следствие предыдущих правил политики, заявленных в явном виде.