2012-04-04 81 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。由于数组为空,因此计数为零,因此参数将被解释为无对象,与一起使用时与%@指定符一起使用。

如果参数不为零,则会发送-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]); 
1

count方法返回一个NSUInteger。

试试这个日志格式代替:

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

这是把一个投中,因为NSUInteger不能保证是一个无符号'int' – JeremyP 2012-04-04 14:45:01

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

,当你想“写一个对象”你应该使用%@据我所知,这就像写[对象描述。 [imageArr计数]是一个int,对不对?它不是指向对象的指针。

您应该使用%i而不是%@。并且大小将为0.

尝试NSLog(@“imageArr size ::%@”,imageArr);如果你想写一个地址

+0

'NSUInteger'是'无符号的一个好主意长'在iPhone上,所以'%i'是错的。 – JeremyP 2012-04-04 14:57:00

相关问题