2017-01-05 2 views
1

Ниже приведена авария при установке CLBeacon на nil.EXC_BAD_ACCESS при установке CLBeacon на ноль

CLBeacon *beacon = [[CLBeacon alloc] init]; 
beacon = nil; // crash 

Это не представляется возможным освободить Инициализированный CLBeacon?


Это может быть воспроизведен путем простого добавления кода выше к новому проекту внутри didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    CLBeacon *beacon = [[CLBeacon alloc] init]; 
    beacon = nil; // crash 
    return YES; 
} 
+1

Вы не должны создавать какие-либо экземпляры 'CLBeacon'. Он выходит из строя, потому что он не получает должным образом инициализацию, если вы не вызываете 'initWithCoder:'. – dan

+0

@dan Он наследует от 'NSObject', так почему же это? – shallowThought

+0

@shallowThought Какую часть вы спрашиваете? Вы не должны создавать какие-либо экземпляры, потому что в документации не говорится. Он не получает должным образом инициализацию, если вы не вызываете 'initWithCoder:', потому что код, который его правильно инициализирует, находится в 'initWithCoder:'. – dan

ответ

1

яблока документации App делегат для CLBeacon состояний:

Вы не создаете экземпляров этого класса напрямую. В отчетах объекта диспетчера местоположений встречаются маяки с ассоциированным объектом делегирования.

Причина, по которой происходит сбой является деталью реализации, которая на самом деле не имеет значения, но это связано с тем, что CLBeacon s не правильно инициализирован, когда вы просто звоните init. Когда он освобождает, CLBeacon различий это _internal ivar и сбоев, если это NULL.

Вы можете посмотреть это, посмотрев на значение CLBeacon->_internal ivar в отладчике. Если вы создаете маяк, используя , тогда ivar будет NULL, но если вы его создадите с [[CLBeacon alloc] initWithCoder:nil], оно будет иметь значение и оно не сработает, когда вы установите маяк на nil.

0

В этой проблеме возникла ошибка при использовании подделанного подкласса. Мои тесты будут разбиваться каждый раз, когда издеваемый подкласс будет отменен ARC.

Решение должно вызвать правильный метод init на CLBeacon. Глядя here, мы видим, что есть метод добавления init. Объявите его в категории в вашем коде.

@interface CLBeacon (PRXInternal) 

- (id)initWithProximityUUID:(id)arg1 major:(id)arg2 minor:(id)arg3 proximity:(long long)arg4 accuracy:(double)arg5 rssi:(long long)arg6 ; 

@end 

Назовите этот инициализатор, если вам нужен экземпляр класса. Не включайте в производственный код.

Смежные вопросы