2011-07-25 9 views
2

私は、プログラミングに新しいポインタメモリについて少し混乱しています。だから私はUITabBarControllerがそうのように選択されたときに基づいてUIBarButtonItemを追加します。ポインタをnil、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はこのようなnilであるかどうかをチェックすることによって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を削除すると、初期化されていないことが考えられますが、間違っていると思います。それはあなたがそれをnilに設定しない限り、メモリ内の参照をまだ持っているようです。それは正しいですか?ありがとう。

答えて

10

これは古典的なdangling pointer問題です。

あなたは、ポインタをゼロしない場合は、ポインタの寿命のために、オブジェクトがライブであることを確認していない限り、それはあるいは、実際にあなたが欲しいものを含んでも含まなくてもよいメモリ内のアドレスにを指し、まだです。

私がこの分野で私を助けてくれることの1つは、所有しているすべてのポインタをリリース時にnilに設定することです。条件付きで `の#define RELEASE_NIL(OBJ)[OBJリリース]に、このマクロを定義すると便利かもしれません

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

、OBJで=(ID)0x42':ここ

は便利になるはずであるマクロですデバッグビルドでは、サイレントエラーではなくデバッグ中にハードクラッシュが発生します。これはバグの検出に非常に役立ちます。 –

+1

0x42には特別な意味がありますか? 0x42の代わりに任意の数にすることはできますか? – AechoLiu

関連する問題