NSMutableArray崩溃的应用程序

时间:2012-04-06 17:33:11

标签: iphone objective-c ios crash nsmutablearray

在一个课程中,我使用getter和setter定义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显示: enter image description here

删除addObject调用会使应用运行正常。我做错了什么会导致应用程序崩溃?

6 个答案:

答案 0 :(得分:2)

这是错误的:

NSUInteger count = [arrayClass.array count];
NSLog(@"%@", count);

你想:

NSLog(@"%u", count);

%@用于指定参数是对象。但是,NSUInteger是原始值,而不是对象。您使用%u作为无符号整数。

答案 1 :(得分:1)

尝试:

NSLog(@"%i", count);

NSUInteger返回INT而不是对象地址

答案 2 :(得分:1)

NSLog(@"%@", count); 

错了,请使用:

NSLog(@"%i", count); 
格式语句中的

%@期望并且必须是对象,NSUInteger在int中,而不是对象。

答案 3 :(得分:1)

您正在使用%@格式说明符,仅适用于Cocoa对象,NSUInteger,它是普通unsigned int上的typedef。请改用%d,%i或%u。

答案 4 :(得分:0)

在我看来,在尝试打印描述时它会崩溃,这是有道理的,因为您正在使用%@NSLog()中需要一个整数。

另外,使用可变属性几乎总是一个坏主意。如果它确实是一个属性,你可能想要使用一个不可变数组,并在你想要改变它时设置整个数组。

答案 5 :(得分:0)

同意记录计数是错误的,但我认为其他答案错过了一个明显的点:崩溃发生在addObject上。这意味着图像为零。在添加之前的NSLog。