Проблема перевыпуска и зомби - PullRequest
0 голосов
/ 24 января 2010

эта программа падает, если я раскомментирую операторы релиза. я понимаю, что я перевыпущен и понял это быстро. но, чтобы проверить зомби, я включил их (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 ]

2 голосов
/ 24 января 2010

Это потому, что вы не владеете объектами, которые пытаетесь освободить (у вас нет ссылки на них). Их право собственности передано «ближайшему» NSAutoreleasePool.

Вы можете прочитать о владении объектом здесь . В качестве краткой справки, как правило, вы не являетесь владельцем, если вы сами не вызвали метод alloc для создания объекта или не retain. Retain объект делает вас владельцем; вызов release означает, что вы отказываетесь от владения (и освобождаете объект, если у него больше нет владельцев).

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

1 голос
/ 24 января 2010

Ну, зомби скажут вам, когда свободный объект получит правильную версию? Так что, если вы не отправляете релиз (вы его прокомментировали), вы не увидите жалобных зомби?

Ваши методы NSString / NSNumber являются удобными, и вам не нужно их освобождать. Так-да, Вы решили проблему самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...