0

これは初心者の質問ですが、MSMutableArray クラス変数が設定されていない理由を一生理解できません。以下は私のコードです:

@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)

その変数が設定されていないのはなぜですか?次の質問を見ましたが、私のコードと受け入れられた回答に違いはありません。

ありがとう。

4

4 に答える 4

1

Change %@ to %lu and you'll see.

于 2012-04-04T14:41:11.300 に答える
1

The count method returns an NSUInteger.

Try this log format instead:

NSLog(@"imageArr size::%u",[imageArr count]);
于 2012-04-04T14:41:28.593 に答える
1

%@ 指定子は、引数がid(またはオブジェクトへのポインター) であることを想定しています。 -countオブジェクトではない NSUInteger を返します。配列が空であるため、カウントはゼロであるため、引数は nil オブジェクトとして解釈され(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 

したがって、おそらく unsigned long です。安全のために、私は常にキャストして確認しているので、これが必要です:

NSLog(@"imageArr size::%lu", (unsigned long)[imageArr count]);
于 2012-04-04T14:55:09.730 に答える
0
NSLog(@"imageArr size::%@",[imageArr count]);

You should use %@ when you want to "write an object" AFAIK, it is like write [object description]. [imageArr count] is a int, right? It is not a pointer to an object.

You should use %i instead of %@. And size will be 0.

Try NSLog(@"imageArr size::%@",imageArr); if you want to write a address

于 2012-04-04T14:44:00.653 に答える