Я предлагаю объявить variable1
, variable2
и variable3
в качестве свойств, а не переменных экземпляра. Затем используйте self.variable1
, self.variable2
и self.variable3
для доступа к ним.
Синтаксис точки (self.variable1
и т. Д.) Использует политику управления памятью, которую вы объявили для каждого свойства; синтаксис стрелки (self->variable1
и т. д.) будет напрямую обращаться к переменным. Сбой произошел из-за того, что вы создали два массива на расстоянии, которое не оставляет вас в собственности, а затем не присвоили массивы свойству, которое их сохранит.
Вы также можете обновить свой проект для использования ARC. Тогда нет никакой разницы в управлении памятью; назначение переменных экземпляра, а не свойств, не приведет к преждевременному освобождению объекта, поскольку ARC считает переменные экземпляра владельцами по умолчанию. Вы все еще можете переключиться на использование свойств после переключения на ARC, но не для предотвращения сбоя.
В ответ на ваши изменения:
Я изменил способ объявления своих переменных на @ property / @ synth, чтобы очистить мой код, но это не решило проблему.
Тогда что-то еще было не так.
Вы никогда не говорили много о самой проблеме. Вы сказали, что получили EXC_BAD_ACCESS
, но не то, какое утверждение вызвало сбой или на каких основаниях вы обвиняли его в показанном вами коде.
Я изменил код с этого:
self.variable1 = [[NSNumber alloc] initWithInt:0];
Это правильный код. Это то, что вы должны использовать.
на это:
self.variable1 = [NSNumber alloc];
[self.variable1 initWithInt:0];
Noooo! Этот код неправильный, неправильный, неправильный на нескольких уровнях.
Методы
init
(включая методы initWithWhatever:
) не гарантируют возвращение того же объекта, которому вы отправили сообщение. initWithInt:
NSNumber очень вероятно не .
Этот объект создает неинициализированный NSNumber объект и назначает его свойству. Затем он отправляет initWithInt:
этому объекту, который вернет инициализированный объект, которым может быть , а очень вероятно будет другим объектом . Теперь вы держите неинициализированный объект (который вы попробуете использовать позже) и бросили инициализированный объект на пол.
Никогда, никогда, никогда не отправляйте alloc
и init
(With…
) в отдельных выражениях. Всегда отправляйте их в одном выражении. Без исключений. В противном случае вы рискуете удерживать неинициализированный объект, а не инициализированный объект. В вашем случае (с NSNumbers) это почти наверняка произойдет.
Что вам следует сделать, это объявить и синтезировать сильное свойство, которому принадлежит объект NSNumber, и создать объект NSNumber в одном выражении: [[NSNumber alloc] initWithInt:]
или [NSNumber numberWithInt:]
. Если вы не используете ARC, вам понадобится последнее, поскольку свойство сохранит объект. Если вы используете ARC, они фактически эквивалентны.
И если у вас возникнет сбой с этим кодом, то что-то еще не так , поэтому, пожалуйста, сообщите нам - либо в этом вопросе, либо в новом вопросе - о сбое, чтобы мы могли помочь вам найти истинная причина этого.