2010-01-23 4 views
0

Эта программа вылетает из строя, если я раскомментирую заявления о выпуске. я получаю, что я слишком быстро и быстро понял. но, чтобы проверить зомби, я включил их (NSZombiesEnabled = YES и CFZombieLevel = 16), и программа работает нормально и не исключает никаких исключений.Проблема с повторным использованием и зомби

Что дает? Я думал, что зомби просто сказали бы мне, что я doofus ... не исправить.

#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 
+0

Почему вы не меняете (id) отправителя (NSButton *) отправителя в - (IBAction) countCharacters :? Таким образом, вам не придется проверять. Если это не только вызвано через GUI. – zneak

+0

@zneak; это не имеет смысла. Метод действия - это всегда '- (IBAction) селектор: (id) отправитель. И проверяете ли вы полностью ортогонально, как работает цель/действие. – bbum

+0

@bbum; Это имеет смысл. Явное указание того, какой объект вы ожидаете отправить, делает невозможным в Interface Builder присвоить действие любому другому типу объекта. Очевидно, что он хочет. Я просто дважды проверял, если бы я сказал что-то совершенно глупое, и он ведет себя точно так, как я его описываю. – zneak

ответ

2

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

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

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

+0

Правильно. Другими словами, если вы должны раскомментировать прокомментированные строки, тогда запустите Zombies, механизм регистрации зомби будет запускаться. – bbum

+0

спасибо, это имеет смысл. я знал, что не должен их выпускать, но он не нажимал, почему бы и нет. – griotspeak

+0

@bbum, но они этого не сделали ... это было вопросом вопроса – griotspeak

1

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

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