2011-07-25 126 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