У вас есть систематическая проблема с неправильным доступом к свойствам вашего класса. Свойства не будут автоматически сохраняться и освобождаться, если вы не используете self.propertyName
для принудительного вызова методов доступа. Например:
[locationManager stopUpdatingLocation]; <-- direct access
self.locationManager = nil; <-- access through generated accessor
[locationManager release]; <-- direct access again with release bypassing the automatic memory management
Вы должны иметь:
[self.locationManager stopUpdatingLocation];
self.locationManager = nil;
//[locationManager release]; this line is now unneeded because the accessor handles it
У вас такая же проблема с recievedData
и startingPoint
. В подавляющем большинстве случаев, если вы используете синтезированные средства доступа, вам нужно вызывать release только для сохраненных свойств в dealloc. Использование аксессуаров прояснит вашу проблему с зомби.
Не зная, где происходит EXC_BAD_ACCESS
, я не могу сказать однозначно, но поскольку эта ошибка часто возникает при отправке сообщений о несуществующем объекте, я могу сказать, что весьма вероятно, что вы обойдете средства доступа к свойству и освободите их вручную, вероятно, вызывает отправку кода в свойство nilled.
Исправьте доступ и посмотрите, решит ли это проблему.
Edit01:
TechZen проблема устранена на 50%.
мое приложение прекрасно работает в
режим отладки, но когда я вытаскиваю
кабель и запускается снова, он падает.
проблема, конечно, с местоположением
менеджер . но мне не понятно
сохраняет и освобождает место
менеджер . Вы можете помочь мне
Я сделаю удар. Для управления памятью:
- Всегда доступ к вашему
self.locationManager
с использованием
обозначение self-dot-propertyName для
убедитесь, что вы используете
механизм удержания / высвобождения
сгенерированные аксессоры.
- Никогда не называйте релиз на любой собственности
кроме как в методе
dealloc
. Если
вы используете обозначение собственной точки и
установить свойство для сохранения, все
но конец жизни релиз
обрабатывается автоматически для вас. это
включает в себя времена, когда вы ноль
свойство или установить его для другого объекта.
- Если сомневаешься, не отпускай. В последнем случае легче устранить утечку памяти, чем отследить ошибку, вызванную объектом, который исчезает в случайных точках в коде, потому что его счетчик сохранения искажен. Попытка предотвратить утечку, когда вы изучаете среду, является формой преждевременной оптимизации, которая вызывает больше проблем, чем предотвращает.
Я отмечаю, что в вашем методе locationManager:didUpdateToLocation:fromLocation:
вы фактически не запрашиваете locationManager, переданный методу, а вместо этого запрашиваете свойство класса self.locationManager
. Это может быть или не быть проблемой, но лучше использовать переданный менеджер, чтобы убедиться, что вы действительно запрашиваете обновленный экземпляр менеджера. Я также не считаю необходимым повторно уничтожать и воссоздавать менеджер местоположения. Я думаю, что вы можете инициализировать его один раз и сохранить его (проверьте документы по этому вопросу).
Если очистка ссылок на ваши свойства и использование прошедшего менеджера не помогают, я предлагаю вам опубликовать новый вопрос с исправленным кодом. В этот момент у вас законно появится новая проблема, и, кроме того, нам нужно увидеть очищенный код, чтобы определить проблему.
Edit02:
(на основе нового кода)
Вам не нужно автоматически высвобождать свойство self.locationManager здесь:
self.locationManager = [[[CLLocationManager alloc] init]autorelease];
Вы используете autorelease только тогда, когда создаете объект и в своем классе, а затем отправляете его другому классу. Вы никогда не выпускаете автоматически свойства класса.
Вы должны прекратить попытки освободить ваши объявленные свойства. Вы никогда не освобождаете свойства, определенные с помощью retain, за исключением метода dealloc. Вы наступаете на свойства, созданные аксессорами, которые автоматически поддерживают счет сохранения.
Вы все еще не используете средства доступа последовательно. Это:
if(locationManager.locationServicesEnabled == YES){
DLog(@"ok now the location manager gets the property");
locationManager.delegate = self;
// This is the most important property to set for the manager. It ultimately determines how the manager will
// attempt to acquire location and thus, the amount of power that will be consumed.
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
// Once configured, the location manager must be "started".
[locationManager startUpdatingLocation] ;
должно быть:
if(self.locationManager.locationServicesEnabled == YES){
DLog(@"ok now the location manager gets the property");
self.locationManager.delegate = self;
// This is the most important property to set for the manager. It ultimately determines how the manager will
// attempt to acquire location and thus, the amount of power that will be consumed.
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
// Once configured, the location manager must be "started".
[self.locationManager startUpdatingLocation] ;
и это:
locationManager.delegate = nil;
должно быть:
self.locationManager.delegate = nil; //<-- why are you doing this anyway?
Вам необходимо отследить все ссылки на все объявленные вами свойства и прикрепить self.
к каждому (ожидайте, что внутри пользовательского средства доступа к свойствам вы, кажется, не используете его - что хорошо в этом случае.)
Я сильно подозреваю, что ваша проблема заключается в том, что вы не нуждаетесь в сохранении свойства self.locationManager.Возможно, вы заставляете менеджера местоположения исчезать наугад.
Вы все еще не используете переданного менеджера в locationManager:didUpdateToLocation:fromLocation:
Я предлагаю вам сделать это или хотя бы проверить, что переданный менеджер - это тот же объект, что и ваш self.locationManager
.просто замените self.locationManager
на manager
.