2009-05-12 16 views
1

iPhone SDKを使用していて、何か簡単な問題があります。 NSNumberオブジェクトをNSMutableArrayインスタンス変数に追加しようとしています。 NSMumber カードをNSMutableArray viewedCardsArrayに追加しようとしましたが、破損することなく配列に追加されません。ここにコードがあります。Objective CのNSMutableArrayにオブジェクトを追加できません。


///////////////////////////////////////////////////// 
// Inside the header file Class.h 
@interface MyViewController : UIViewController { 
    NSMutableArray *viewedCardsArray; 
    //snip ... 
} 
@property (nonatomic, retain) NSMutableArray *viewedCardsArray; 
@end 

///////////////////////////////////////////////////// 
// Inside the methods file Class.m 
#import "StudyViewController.h" 

@implementation StudyViewController 
@synthesize viewedCardsArray 
    //snip ... 

- (IBAction)doShowCard { 
    //snip ... 
    NSNumber *cardIdObject = [[NSNumber alloc] initWithInt:(int)[self.currentCard cardId]]; 
    [viewedCardsArray addObject: cardIdObject]; 
    [cardIdObject release]; 
} 

したがって、このコードは実行され、リークするようではありません(Leaksパフォーマンスツールによる)。しかし、コードをステップ実行すると、CardIdObjectに表示されます.CardsArray

私はこれらの基本的な質問がObjCの初心者(私のような)にはかなり共通していることを知っています。

答えて

17

viewedCardsArrayを初期化しましたか? - あなたはどこかにする必要がない場合は、これは通常、あなたのクラスのinit方法で行われます。

- (void)dealloc 
{ 
    [viewedCardsArray release]; 
    [super dealloc]; 
} 
+2

[super init]の結果を使用することを忘れないでください。これは、nilまたは別のオブジェクトを返すことができます。あなたの元の自己を返却したと仮定してはいけません。なぜなら、それがリリースされなかったときに解放され、死んだオブジェクトがさらに初期化されると、クラッシュが発生するからです。最も簡単な方法はif((self = [super init])){/ *ここで初期化する* /} selfを返すことです。 (自分のスタイルの好みに合わせて、必要に応じて条件の前に割り当てることができます)。 –

+0

私はその行をself = [super init]にすることを意味していました。しかし、はい、それはより良いアプローチです –

+0

皆さんに助けていただきありがとうございます。私は今、クラス宣言と変数のインスタンス化の違いを感謝します! – pchap10k

3

Perspxを初期化する1つの方法を概説している:

- (id)init 
{ 
    self = [super init]; 
    if(self) { 
     viewedCardsArray = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

その後はdealloc方法で放出されますアレイ。しかし、あなたはまた、NSArrayのが提供するクラスのメソッドを使用することができます。

self. viewedCardsArray = [NSMutableArray array]; 

これは、initにまたは別の場所に行くことができます。

注:オブジェクトは自動リリースされます。

+1

これは、-initで独自のプロパティを設定したときに、完全に初期化されていないオブジェクト(self)にメッセージ(特にアクセサーメッセージ)を送信しているという問題があります。 -deallocの逆の場合も同様です。これは、他のいくつかのivarがすでに初期化されており、その中のオブジェクト(存在する場合)がまだ有効であることを前提とするカスタムアクセサを実装すると問題になります。 –

+0

合成プロパティを使用している場合、これは完全に有効な方法です。例えば、これを行うAppleのコードと逆:-deallocメソッドでのself.someProperty = nilの使用があります。 –

+0

ありがとう、これは知っていると便利です – pchap10k

関連する問題