我對Objective-C非常陌生,並且正在通過內存管理進行閱讀。我試圖與NSAutoreleasePool玩一下,但不知何故它不會釋放我的對象。Objective-C自動釋放池不釋放對象
我有一個setter和getter類,它基本上設置了一個NSString *名稱。釋放池後,我試圖NSLog的對象,它仍然工作,但我想它不應該?
@interface TestClass : NSObject
{
NSString *name;
}
- (void) setName: (NSString *) string;
- (NSString *) name;
@end
@implementation TestClass
- (void) setName: (NSString *) string
{
name = string;
}
- (NSString *) name
{
return name;
}
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
TestClass *var = [[TestClass alloc] init];
[var setName:@"Chris"];
[var autorelease];
[pool release];
// This should not be possible?
NSLog(@"%@",[var name]);
return 0;
}
您可以安全地將發佈發送到零,因此您的測試該名稱不是零是不必要的。 – JeremyP 2010-05-07 12:52:06
非常感謝您的回答......這正是發生的事情。釋放池之後,我嘗試用TestClass * var1 = [TestClass new]創建一個新對象; [var name]的NSLog爲NULL ....當我爲var1設置名稱[var1 setName = @「John」]時,我實際上可以通過舊對象「var」訪問「John」.... so [var name]實際上打印了「John」... 如果NSZombieEnabled設置爲YES,它會崩潰。這是完美的 經驗教訓。謝謝! – Chris 2010-05-07 13:01:19