對於非ARC代碼:
- (IBAction) messageZombie:(id)sender {
id a = [[NSObject alloc]init];
[a release];
NSLog(@"%@", [a description]);
}
這會給你EXC_BAD_ACCESS殭屍了,和「消息發送到釋放實例」的消息,並啓用殭屍。
如果您的項目正在使用ARC,那麼可靠地導致消息解除分配對象(畢竟是ARC的點)有點困難。
這工作:
- (IBAction) messageZombie:(id)sender {
id a = [[NSObject alloc]init];
id __unsafe_unretained b =a;
a=nil;
NSLog(@"%@", [b description]);
}
它可能不是非常相似,你的實際代碼是幹什麼的,因爲誰到底採用__unsafe_unretained啊?但是如果你只是想確保NSZombies正常開啓,這應該是一個合理的測試用例。
如果您在代碼中查找可疑的地方,那麼一定要查找__unsafe_unretained指針,儘管您不會找到任何*,並仔細檢查是否將正確的演員用於轉換爲CoreFoundation對象可可物體。
*如果您的項目需要支持10.7之前的OS X版本或5.0之前的iOS版本,那麼您不能使用__weak指針,因此在那類項目中,您會希望更頻繁地使用__unsafe_unretained 。
@zaph不,這是內存泄漏。殭屍是一個指向釋放對象的指針。 – rmaddy
@zaph如果你有殭屍啓用,殭屍是當你釋放一個對象時留下的東西。殭屍不會釋放那些內存,而是擁有該內存,並在發送消息時提醒你 - 這應該是一個釋放對象。 –
@zaph殭屍(作爲調試工具)的重點在於找到一些情況,即指針仍然位於已釋放的對象的周圍,然後嘗試訪問該對象。 – rmaddy