Должен ли я выделить переменную экземпляра NSMUtableArray? - PullRequest
2 голосов
/ 11 ноября 2009

Это, вероятно, глупый вопрос, но я обдумывал его некоторое время, без очевидного ответа.

У меня есть небольшое приложение, над которым я работаю, и у меня проблема с моей переменной экземпляра NSMutableArray. Это всегда было (null), пока я не добавил [[NSMutableArray alloc] init] в viewDidLoad.

Я довольно новичок в мире Objective C, поэтому я пытаюсь понять эту проблему. У меня сложилось впечатление, что при создании экземпляра класса все переменные экземпляра были распределены. Когда я добавляю элементы в массив без alloc / init, он остается (нулевым) с счетом сохранения 0.

Рассматриваемый массив был объявлен как (сохраняемое) свойство.

Я могу добавить код, если это не ясно.

Ответы [ 2 ]

5 голосов
/ 11 ноября 2009

Любые переменные экземпляра, которые являются объектами, на самом деле являются просто указателями, которые инициализируются в nil (0). Вот почему элемент не сохраняется и не добавляется в массив, поскольку сообщения для nil-объектов возвращают nil / 0.

Вам нужно выделить и инициализировать объект в init вашего класса, а затем освободить его в dealloc.

2 голосов
/ 11 ноября 2009

Спецификаторы retain / assign / copy в объявлении свойства описывают, как память для значения свойства управляется в методах получения и установки, которые компилятор синтезирует для вас. ( Документация подробно обсуждает их и дает пример кода для каждого вида.)

Это полностью ортогонально тому, инициализированы ли переменные вашего экземпляра для вас или нет. Объявление ivar просто резервирует хранилище для значения; для классов Objective C это указатель на экземпляр. Среда выполнения инициализирует эти ивары для вас нулем, но вы по-прежнему отвечаете за создание объектов, которые вы хотите сохранить там. (То же самое верно для подобных языков, таких как Java или C #: объявление переменной экземпляра Array просто дает вам место для ссылки, но не создает для вас массив.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...