2012-04-04 10 views
0

これはnoobの質問ですが、私の人生のために私のMSMutableArrayクラス変数が設定されていない理由を理解できません。以下は、私のコードは次のとおりです。Objective-Cクラスのインスタンス変数が設定されていないのはなぜですか?

@interface MyClass : NSObject { 
    NSMutableArray *imageArr; 
} 

@implementation MyClass 
-(id)init 
{ 
    self = [super init]; 
    if (self) { 
     imageArr = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

- (void) checkImageArr { 
    NSLog(@"imageArr size::%@",[imageArr count]); 
} 

このコードを実行すると、以下のログに設定されています:

imageArr size::(null) 

なぜ変数が設定されていないということですか?私は以下のquestionを見て、私のコードと受け入れられた答えとの間に何か違うものは見当たりません。

ありがとうございました。

答えて

1

%@指定子は、引数がid(またはオブジェクトへのポインタ)であると想定しています。 -countは、オブジェクトではないNSUIntegerを返します。あなたの配列は空であるので、カウントはゼロであるので、引数は無指定オブジェクトとして解釈され、%@指定子と一緒に使用すると、(null)として出力されます。

引数がnilでない場合は、ログメッセージに挿入する文字列を取得するために-descriptionが送信されます。したがって、配列にオブジェクトを追加すると、NSLogは1をオブジェクトポインタとして解釈し、-descriptionをそれに送信しようとします。これにより、EXC_BAD_ACCESS例外が発生します(試してみてください)。

引数を数値として解釈する書式指定子が必要です。 NSUintegerは、それはおそらく、符号なしロングの次の定義

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef unsigned long NSUInteger; 
#else 
typedef unsigned int NSUInteger; 
#endif 

を持っています。

NSLog(@"imageArr size::%lu", (unsigned long)[imageArr count]); 
1

%@%%luに変更すると表示されます。

1

countメソッドはNSUIntegerを返します。

ではなく、このログフォーマットを試してみてください。

NSLog(@"imageArr size::%u",[imageArr count]); 
+0

NSUIntegerが '符号なしint' – JeremyP

0
NSLog(@"imageArr size::%@",[imageArr count]); 

あなたはそれが書き込み[オブジェクト記述]のようなものです、私の知る限り、「オブジェクトを書き込む」したいときは、%@を使用する必要があります。 [imageArr count]はintですか?これはオブジェクトへのポインタではありません。

%@の代わりに%iを使用する必要があります。サイズは0になります。

NSLog(@ "imageArr size ::%@"、imageArr)を試してみてください。

+0

' NSUInteger'は '符号なしであることが保証されていないので、それはでキャストを置くことをお勧めします:安全のため、私はいつもあなたがこれを必要とするので、確認するために、それをキャスト長い間iPhoneで「%i」が間違っている。 – JeremyP

関連する問題