繁体   English   中英

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

[英]Why is my Objective-C class instance variable not being set?

这是一个菜鸟问题,但我终生无法弄清楚为什么未设置我的 MSMutableArray class 变量。 下面是我的代码:

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

为什么没有设置该变量? 我查看了以下问题,没有发现我的代码和接受的答案之间有什么不同。

谢谢。

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

count 方法返回一个 NSUInteger。

试试这个日志格式:

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

%@ 说明符期望参数是一个id (或指向一个对象的指针)。 -count返回一个 NSUInteger,它不是 object。由于您的数组为空,因此计数为零,因此参数被解释为 nil object,与%@说明符一起使用时显示为(null)

如果参数不是 nil, -description将被发送给它以获取要插入到日志消息中的字符串。 因此,如果您将 object 添加到数组中, NSLog将尝试将 1 解释为 object 指针并将-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]);
NSLog(@"imageArr size::%@",[imageArr count]);

当你想“写一个对象”AFAIK 时,你应该使用 %@,就像写 [object description]。 [imageArr count] 是一个整数,对吧? 它不是指向 object 的指针。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM