Я потратил около 10 часов, пытаясь найти эту ошибку, которая вызывала сбой моего приложения, и это было в последнем месте, где я выглядел (ну, это было бы, но последнее место, где я когда-либо ожидал).
Изначально я думал, что у меня проблемы с управлением памятью (несбалансированное сохранение / освобождение), потому что сбой происходил каждый раз, когда я отправлял -removeAllObjects
на NSMutableArray
, заполненный моими объектами.Авария не произойдет, когда в первый раз позвонят -removeAllObjects
.Я мог бы очистить массив один раз, снова заполнить его, а затем на втором очистить, я получил бы EXC_BAD_ACCESS.Это когда мой массив заполняется 3 объектами в первом «цикле» и 3 снова во втором «цикле».Когда я хранил только 1 объект в массиве в каждом цикле, потребовалось 4 цикла сбоя (при 4-м вызове -removeAllObjects
).
Я НАКОНЕЦ понял, что сбой исчезнет, если я изменю -init
метод моего пользовательского объекта.Вот реализация -init
;все 4 ивара являются синтезированными свойствами с (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 утра прошлой ночью из-за этого.