【发布时间】:2011-04-11 17:55:52
【问题描述】:
我花了大约 10 个小时试图找到导致我的应用程序崩溃的错误,它位于我最后一次查看的地方(本来应该是,但我没想到它会在最后一个地方)。
最初我认为我有内存管理问题(不平衡的保留/释放),因为每次我将-removeAllObjects 发送到填充了我的自定义对象的NSMutableArray 时都会发生崩溃。第一次调用-removeAllObjects 时不会发生崩溃。我可以清除一次数组,重新填充它,然后在第二次清除时,我会得到一个 EXC_BAD_ACCESS。这是我的数组在第一个“循环”中填充了 3 个对象,在第二个“循环”中再次填充了 3 个对象。当我在每个周期中仅在数组中存储 1 个对象时,需要 4 个周期才能崩溃(在第 4 次调用 -removeAllObjects 时)。
我终于意识到,如果我更改自定义对象的 -init 方法,崩溃就会消失。这是-init 的实现;所有 4 个 ivars 都是具有 (nonatomic, retain) 的综合属性,所有类型均为 (NSString *),除了 icon 是 (NSNUmber *)
-(id)init {
if (self = [super init]) {
ip = @"";
mac = @"";
vendor = @"";
icon = [NSNumber numberWithInt:0];
}
return self;
}
将其更改为修复了该错误:
-(id)init {
if (self = [super init]) {
self.ip = @"";
self.mac = @"";
self.vendor = @"";
self.icon = [NSNumber numberWithInt:0];
}
return self;
}
我了解到不应在 -init 方法中使用访问器,因为它可能会导致麻烦(例如,使用子类化)。
如果有人可以向我解释为什么当我使用访问器时我的错误消失了,我将非常感激!说真的,这让我发疯了,因为这个,昨晚一直到凌晨 5 点。
【问题讨论】:
标签: iphone objective-c cocoa properties