2013-06-08 2 views
0

Получаю вышеуказанное сообщение в XCode 4.6. Я провел довольно тщательный поиск, но ничего похожего не соответствует точным обстоятельствам, связанным с моей проблемой. По общему признанию, я относительно новичок в iOS-разработчике, и управление памятью никогда не было моим сильным костюмом, но это только меня полностью разозлило.EXC_BREAKPOINT: сообщение отправлено на освобожденный экземпляр

У меня есть экземпляр переменной , который определен в классе Game следующим образом:

@interface Game : NSObject 

// Class objects 
@property(nonatomic,retain) NSMutableArray *queryItems; 
@property(nonatomic,retain) NSMutableArray *theArray; 
@property(nonatomic,retain) NSString *theLink; 
@property(nonatomic,retain) NSString *thePath; 

устанавливается в makeGame метода, который называется в методе initialiseGame на мой взгляд контроллера:

- (void) initialiseGame 
{ 
    bool gameCreated = FALSE; 
    while (!gameCreated) 
    { 
     gameCreated = [theGame makeGame:@"ptl"]; 
    } 
    [loadingIndicator stopAnimating]; 
    [loading setText:@"Tap to Start"]; 
    [self performSelector:@selector(setLabels) withObject:nil afterDelay:0.0]; 
} 

(Примечание: Выполнение функции выбора AfterDelay используется, чтобы разрешить просмотр до того, как продолжить. Немного взломать, но я не мог бы лучше поработать!)

Приложение затем загружает игру, и когда пользователь нажимает на экране, чтобы начать, следующий метод, который вызывается из контроллера представления является:

- (void) setupLink 
{ 
    ... 
    for(int i=0; i<[theGame.theLink length]; i++) { 
     ... 
    } 
} 

Именно на этой ссылку на theGame.theLink, где I» Я получаю крах.

Что имеет меня больше запутаться в том, что если я называю theGame.theLink внутри метода initialiseGame, он отображается правильно, а также вызовом любой другой переменной из Game класса (например, thePath или theArray работает отлично, поэтому theGame объект не имеет был удален в полном объеме, только переменная .

Мне кажется, что переменная освобождается где-то, когда контроллер вида обновляется. Я не выпустил переменную и не могу решить, почему только эта переменная освобождается. Как я уже сказал, управление памятью не является моей силой!

Любая помощь/идеи были бы чрезвычайно оценены. Дайте мне знать, если вам потребуются более подробные сведения.

Благодарности куч, Andrew

EDIT: Установка в makeGame

- (bool) makeGame:(NSString*)gameType 
{ 
    ... 
    [self getLink]; 
} 

- (void) getLink 
{ 
    ... 

    if (... && ((arc4random() % 10) > 8)) 
    { 
     theLink = @"Animals"; 
    } 
} 

Есть много различных способов могут быть установлены, в зависимости от случайных чисел и других факторов. Это самая простая форма, которая просто устанавливает ее в статическую строку. Неважно, как установлен или что он установлен, программа всегда сбой в одной и той же точке.

+1

Есть ли причина, по которой вы используете ручное управление памятью вместо ARC? Этот тип проблемы реже встречается при использовании ARC. –

+0

не хватает кода. Когда вы вызываете initialiseGame? когда вы вызываете setupLink? кажется, что thegame освобожден, но не theGame.theLink. – wihing

+0

Даже если это не повлияет на вашу текущую проблему, вы все равно должны использовать атрибут 'copy' для изменяемых переменных экземпляра. – Till

ответ

0

Если параметрLink установлен на передаваемый ему параметр, «ptl» или некоторая подобная временная строка, это даст вам проблему, поскольку это всего лишь указатель, указывающий на текущее местоположение, которое удерживает @ ПТЛ». После того, как метод makeGame будет завершен, ваша система будет считать, что все это делается с помощью @ "ptl" и просто освободите его.

Когда вы создаете @ "stringwhatever" в своем коде, он должен быть эквивалентом создания NSObject, который является неизменным литералом экземпляра @ "stringwhataver". Он должен теоретически обрабатывать все подсчет ссылок хорошим способом, но когда вы выполняете собственное управление памятью, существует так много способов потерять количество ссылок.

+0

theLink устанавливается программно в методе makeGame. То, что оно установлено, зависит от передаваемого параметра, но не включает сам параметр. Я не размещал код, так как существует множество разных способов, которыми theLink может быть установлен в makeGame. Я пытаюсь опубликовать наиболее релевантные разделы. –

+0

Когда theLink - это вещь, чья ссылка теряется, я думаю, что то, как она устанавливается, вероятно, является наиболее подходящим кодом, который у вас есть. – HalR

+0

Я не понимаю, почему я могу ссылаться на объектLink в методе, который вызывает makeGame, но не снаружи этого метода. Я бы подумал, будет ли система освобождать память, которая произошла после того, как makeGame будет завершен не после завершения метода _containing_ makeGame? –

0

Существует довольно простое правило для подражания. Если вы объявили свойства, обращайтесь к ним через свойство. Чтобы сделать иначе (как вы делаете выше, с theLink = ...) обходит все управление памятью, встроенные в аксессоры свойств.

self.theLink = ... 

Решил бы эту проблему при MRC. Переход на ARC «решил» вашу проблему, если вы не понимаете причину.

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