2012-04-06 83 views
0

在一类,我与getter和setter限定NSMutableArray的NSMutableArray崩溃应用

@interface ArrayClass : NSObject { 
    NSMutableArray *array; 
} 
@property (nonatomic, strong) NSMutableArray *array; 

@end 

然后执行文件内,我allocinit的可变数组:

#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调用使应用程序运行正常。我做错了什么会导致应用程序崩溃?

回答

2

这是错误的:

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

你想:

NSLog(@"%u", count); 

%@是用来指定该参数是一个对象。但是,NSUInteger是一个原始值,而不是一个对象。您使用%u作为未签名的整数。

1

尝试:

NSLog(@"%i", count); 

NSUInteger返回一个int不是一个对象地址

1
NSLog(@"%@", count); 

是错误的,使用:

NSLog(@"%i", count); 

%@格式语句要求,并且必须为对象,NSUInteger在int中,而不是对象。

0

它在我看起来像它试图打印说明时崩溃,这是有道理的,因为您使用%@其中一个整数在您的NSLog()预计。

另外,使用可变属性几乎总是一个坏主意。如果它真的是一个属性,那么你可能想要使用一个不可变的数组,并且当你想改变它时设置整个数组。

0

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

+0

实际上,NSLog是崩溃的来源。应该更多地缩小我的问题。 – 2012-04-06 17:45:26

1

您使用的是%@格式说明,这是唯一的Cocoa对象,对于NSUInteger,这是一个普通的unsigned int一个typedef。改为使用%d,%i或%u。