Проблема перевыпуска и зомби
Эта программа падает, если я раскомментирую заявления о выпуске. я понимаю, что я перевыпущен и понял это быстро. но, чтобы проверить зомби, я включил их (NSZombiesEnabled = YES и CFZombieLevel = 16), и программа работает нормально и не выдает никаких исключений.
что дает? я думал, что включение зомби просто скажет мне, какой я глупец... не исправить это.
#import "AppController.h"
@implementation AppController
-(IBAction)countCharacters:(id)sender {
//did a button do this?
if(![sender isKindOfClass:[NSButton class]]) {
NSLog(@"%@ is not a button", sender);
return;
}
//proceed
NSString *userString = [textField stringValue];
NSNumber *count = [NSNumber numberWithInt:[userString length]];
NSString *outputString = [NSString stringWithFormat:@"'%@' has %@ characters.",
userString, count];
//[userString release];
//[count release];
[labelField setStringValue:outputString];
//[outputString release];
}
@end
2 ответа
Это потому, что вы не владеете объектами, которые пытаетесь освободить (у вас нет ссылки на них). Их право собственности передано "ближайшему" NSAutoreleasePool.
Вы можете прочитать о владении объектом здесь. В качестве краткой справки, как правило, вы не являетесь владельцем, если вы не позвонили alloc
сам способ создать объект или, если вы этого не сделали retain
Это. Retain
использование объекта делает вас владельцем; призвание release
означает, что вы отказываетесь от владения (и освобождаете объект, если у него больше нет владельцев).
Вы не должны выпускать объекты, для которых у вас нет прав собственности. Ваш текущий код без релиза именно то, что вам нужно.
Что ж, зомби скажут вам, когда свободный объект получит правильную версию? Таким образом, если вы не отправляете релиз (вы его прокомментировали), вы не увидите жалобных зомби?
Все ваши методы NSString/NSNumber являются вспомогательными, и вам не нужно их освобождать. Так-да, вы решили проблему самостоятельно.