2009-12-01 14 views
51

私はビューコントローラの.hファイルにNSMutableArray *categoriesを宣言し、そのプロパティを宣言しました。私の.mファイル内NSXMLParserデリゲートのparser:foundCharacters:方法でNSMutableArray addObjectが動作しません

、私はこのコードを持っている:

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string 
{ 
    if (elementFound) 
    { 
     element = string; 
     [self.categories addObject:element]; 
    } 
} 

をしかし、私はデバッグモードでそれに足を踏み入れる後[self.categories addObject:element]行にカーソルを合わせると、Xcodeは私に語りましたサイズは0x0,0オブジェクトです。私のXMLファイルには3つの要素がありますので、3つの項目が配列内にあるはずです。

私は何かが本当に明白でなく、何かを理解できません。

+3

ポストエディタの上部にある「コード」フォーマッタボタンを使用して、コードブロックを選択して4つのスペースすべてをインデントすることです。 –

+0

申し訳ありません - 別のフォーラムからコピーして貼り付けました。ありがとう – joec

答えて

140

"0x0"部分はメモリアドレスです。特に、 "nil"は、これが呼び出されたときに変更可能な配列が存在しないことを意味します。あなたの-initメソッドで作成してみてください:

categories = [[NSMutableArray alloc] init]; 

-deallocで忘れずにリリースしてください。

+11

私はなぜこれを忘れるのか分かりません。ありがとう。 – James

+17

(2012年のアップデート:ARCを使用している場合、release/deallocの部分は無視されます) –

+4

ありがとうございます! Objective-Cでは、オブジェクト参照がゼロでないメッセージが失敗しないことを忘れてしまうのは簡単です。 – JasonD

6

ので解放する必要が自動解放されていない

categories = [NSMutableArray array]; 

配列クラスのメソッドを使用して、空の配列を初期化します。

+0

Vishu - あなたのソリューションは機能していますが、Joshua Nozziのソリューションはメモリが少なくて済むので、より良いソリューションだと思います。 –

+0

これは機能的には私の答えと5年半のもっと高価で、単にalloc/initの代わりに便利なメソッドを使用しています。メモリ使用量に違いはなく、結果はまったく同じです。 –

-2
@property (Strong, nonatomic) NSMutableArray * yourArray; 

あなたは強いを使用する必要があります。

+0

これは質問に答えません - 配列は初期化されていないので、存在しません(したがってnilです)。また、 '強い'はObjC 2のプロパティのデフォルトですが、与えられたコードからどのように宣言されているかについては何も分かりません。私たちが知っていることは、実行時には存在せず、クラスのivarのように見えるので、メソッドが呼び出された時点で配列が割り当てられていないということだけがわかります。初期化時に作成され、別の場所で削除された可能性があります。私の主張は、この答えは多くの仮定を作り、非常に曖昧です。私はそれが古くから受け入れられている答えに何が追加されるのか見ていない。 –

関連する問題