EXC_BAD_ACCESS при установке синтезированного (сохраненного) свойства в ноль - PullRequest
3 голосов
/ 03 февраля 2011

Я получаю неправильный доступ (objc_msgsend) при вызове этой строки кода:

self.currentGameTeam = nil;

Где «currentGameTeam» определен в интерфейсе для класса «MCState» как:

MNAvailableTeamContext *currentGameTeam;

И я синтезирую для него свойство:

@property (retain) MNAvailableTeamContext *currentGameTeam;

После установки NSZombieEnabled консоль показывает:

*** -[MNAvailableTeamContext release]: message sent to deallocated instance 0x5b3eba0

И трассировка отладчика показывает, что она исходит из синтезированного установочного кода:

#3  0x0001fa96 in -[MCState setCurrentGameTeam:] at MCState.m:44

Я просмотрел несколько других вопросов и тем и не могу найти ответ, который относится к моему делу. Я не понимаю, почему был бы плохой доступ, если я синтезировал свойство, и я установил его на ноль. Что особенно странно, так это то, что в MCState есть как минимум 3 других свойства, которые определяются и используются точно так же, как currentGameTeam, с той лишь разницей, что они являются разными типами:

MNUserContext *storedUser;
MNActiveGameContext *storedGame;
MNAvailableUserContext *storedGameUser;
MNAvailableTeamContext *storedGameTeam;

и

@property (retain) MNUserContext *currentUser;
@property (retain) MNActiveGameContext *currentGame;
@property (retain) MNAvailableUserContext *currentGameUser;
@property (retain) MNAvailableTeamContext *currentGameTeam;

и

@synthesize currentUser;
@synthesize currentGame;
@synthesize currentGameUser;
@synthesize currentGameTeam;

наконец

self.currentUser = userContext;
self.currentGame = nil;
self.currentGameUser = nil;
self.currentGameTeam = nil; // Error occurs here

Остальные работают нормально - только currentGameTeam доставляет мне неприятности. Есть идеи?

Ответы [ 4 ]

7 голосов
/ 03 февраля 2011

Где-то, currentGameTeam освобождается до того, как вы попытаетесь установить его на ноль.Установка сохраненного свойства в ноль подразумевает выпуск, который будет вызван.Вызов release для объекта, который уже был освобожден, приведет к EXC_BAD_ACCESS.Это подтверждается вашим бегом с включенными NSZombies.

Вы можете работать с инструментами с помощью инструмента Zombies - он даст вам более подробную информацию обо всех удержаниях, выпусках и авто-выпусках, ведущих к вызову зомби.

0 голосов
/ 25 января 2013

Последнее время, установленное на ноль, должно уже установить его на ноль.

Так что следующий раз, установленный на ноль, не должен быть вредным. Не уверен, почему происходит сбой.

0 голосов
/ 03 февраля 2011

У меня были некоторые ошибки, подобные этой, и обычно они выслеживали их до опечатки где-то, где я хотел набрать currentGameUser, но набрал currentGameTeam, так что в итоге я дважды отпустил один из объектов и не отпустил другой. Я бы попробовал сделать Build and Analyze, а если ничего не нашел, попробуйте Run with Performance Tool > Leaks.

Я говорю это, так как ваш код выглядит нормально, за исключением того, что вы объявляете stored*, а затем объявляете и синтезируете свойства для current*, что выглядит как несоответствие, поэтому могут быть другие места, где подобные типы близких, но разных опечаток могут произошло.

0 голосов
/ 03 февраля 2011

У вас есть ивар с именем currentGameTeam?

...