为什么我的Objective-C类实例变量没有被设置?

时间:2012-04-04 14:39:21

标签: iphone objective-c ios ios5

这是一个菜鸟问题,但我不能为我的生活弄清楚为什么我的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)

为什么没有设置变量?我查看了以下question,并且在我的代码和接受的答案之间没有看到任何不同。

感谢。

4 个答案:

答案 0 :(得分:1)

将%@更改为%lu,你会看到。

答案 1 :(得分:1)

count方法返回NSUInteger。

请尝试使用此日志格式:

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

答案 2 :(得分: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 

所以它可能是一个无符号长。为了安全起见,我总是把它强制确保,所以你需要这个:

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

答案 3 :(得分:0)

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

当你想要“写一个对象”AFAIK时,你应该使用%@,这就像写[对象描述]。 [imageArr count]是一个int,对吗?它不是指向对象的指针。

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

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