2015-08-14 61 views
4

我新的目標cxcode的和一個應用程序我目前正在寫在接收臭名昭著EXC_BAD_ACCESS錯誤。Objective-C的示例代碼有意消息的解除分配的對象

幾乎所有人都推薦使用NSZombies來解決問題。我認爲我有NSZombies的工作,但xcode是不是給我一個關於殭屍當我的應用程序崩潰消息警報。

在繼續我的調試之前,我想運行一些代碼,以確保將消息發送到zombie(取消分配的對象)。

什麼是一個簡單的代碼片段,其中一條消息被髮送到一個釋放對象,導致一個場景NSZombies應該提醒我?

+1

@zaph不,這是內存泄漏。殭屍是一個指向釋放對象的指針。 – rmaddy

+0

@zaph如果你有殭屍啓用,殭屍是當你釋放一個對象時留下的東西。殭屍不會釋放那些內存,而是擁有該內存,並在發送消息時提醒你 - 這應該是一個釋放對象。 –

+1

@zaph殭屍(作爲調試工具)的重點在於找到一些情況,即指針仍然位於已釋放的對象的周圍,然後嘗試訪問該對象。 – rmaddy

回答

6

對於非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 。

+1

當然這是非ARC代碼。 – zaph

+0

@MarkBessey謝謝,這是我正在尋找的,唯一的問題是,我有自動引用計數啓用,我得到的錯誤:「ARC禁止明確的消息發送'釋放'」 –

+4

這可能不會實際上崩潰,甚至與殭屍關閉。 – rmaddy

1

您可以創建一個CF對象,將其連接到Objective-C對象,然後釋放它並嘗試使用橋接對象。我想你必須使用__bridge才能讓它按照你想要的方式行事。

相關問題