2011-07-25 80 views
2

對於指針存儲器是編程新手而言,我有點困惑。所以我添加基於的UIBarButtonItem時的UITabBarController選擇像這樣:將指針設置爲零,objective-c

NSMutableArray *barItems = [[self.MainToolbar items] mutableCopy]; 
    if (_sortButton == nil) { 
     _sortButton = [[UIBarButtonItem alloc] initWithTitle:@"Sort" style:UIBarButtonItemStyleBordered target:self action:@selector(sortButtonPressed:)]; 
     [barItems insertObject:_sortButton atIndex:0]; 
     [self.MainToolbar setItems:barItems]; 
     [_sortButton release]; 
    } 

我試圖通過檢查_sortButton爲零這樣除去UIBarButton:

if (_sortButton != nil) { 
     // self.SortButton = nil; // I NEEDED THIS 
     NSMutableArray *barItems = [[self.MainToolbar items] mutableCopy]; 
     [barItems removeObjectAtIndex:0]; 
     [self.MainToolbar setItems:barItems]; 
    } 

這沒有工作,直到我說註釋行self.SortButton = nil。有人可以解釋嗎?我認爲,如果我從數組中刪除_sortButton,它將被初始化,但我想這是錯誤的。它似乎仍然在內存中有它的參考,除非將它設置爲零。這是正確的嗎?謝謝。

回答

10

這是經典的dangling pointer問題。

如果不空出一個指針,它仍然是指向到內存中的地址,可能會或可能不會實際包含你想要的東西,除非你確保了指針的生命週期,對象是活。

我在這方面幫助我做的一件事是在我釋放它們時將所有擁有的指針設置爲nil

這裏有一個宏,肯定是得心應手:

#define RELEASE_NIL(obj) [obj release], obj = nil 
+5

它可能是有用的,有條件地定義這個宏'#定義RELEASE_NIL(OBJ)OBJ發佈],OBJ =(ID)0x42'在調試版本會在調試過程中遇到嚴重的崩潰而不是無聲的失敗,這對於拾取錯誤非常重要。 –

+1

0x42有什麼特別的含義嗎?它可以是任何數字而不是0x42? – AechoLiu