的NSMutableArray崩溃应用
问题描述:
在一类,我与getter和setter限定NSMutableArray
:的NSMutableArray崩溃应用
@interface ArrayClass : NSObject {
NSMutableArray *array;
}
@property (nonatomic, strong) NSMutableArray *array;
@end
然后执行文件内,我alloc
init
的可变数组:
#import "ImageUploader.h"
@implementation ArrayClass
@synthesize array;
- (id)init {
self = [super init];
if (self != nil) {
NSLog(@"ArrayClass inited");
array = [[NSMutableArray alloc] init];
}
return self;
}
@end
然后我初始化一个这个类的实例来自另一个类:
ArrayClass *arrayClass = [[ArrayClass alloc] init];
[arrayClass.array addObject:image];
NSUInteger count = [arrayClass.array count];
NSLog(@"%@", count);
但是当我尝试将一个对象添加到可变数组,应用程序崩溃和Xcode的4.3所示:
卸下addObject
调用使应用程序运行正常。我做错了什么会导致应用程序崩溃?
答
这是错误的:
NSUInteger count = [arrayClass.array count];
NSLog(@"%@", count);
你想:
NSLog(@"%u", count);
%@
是用来指定该参数是一个对象。但是,NSUInteger是一个原始值,而不是一个对象。您使用%u
作为未签名的整数。
答
尝试:
NSLog(@"%i", count);
NSUInteger返回一个int不是一个对象地址
答
NSLog(@"%@", count);
是错误的,使用:
NSLog(@"%i", count);
%@
格式语句要求,并且必须为对象,NSUInteger
在int中,而不是对象。
答
它在我看起来像它试图打印说明时崩溃,这是有道理的,因为您使用%@
其中一个整数在您的NSLog()
预计。
另外,使用可变属性几乎总是一个坏主意。如果它真的是一个属性,那么你可能想要使用一个不可变的数组,并且当你想改变它时设置整个数组。
答
同意计数的记录是错误的,但我认为其他答案错过了一个明显的观点:崩溃发生在addObject上。这意味着图像是零。 NSLog之前添加。
答
您使用的是%@
格式说明,这是唯一的Cocoa对象,对于NSUInteger
,这是一个普通的unsigned int
一个typedef。改为使用%d,%i或%u。
实际上,NSLog是崩溃的来源。应该更多地缩小我的问题。 – 2012-04-06 17:45:26