Во-первых, я предполагаю, что у вас есть свойство с именем myArray
и iVar с именем myArray
? Если это так, случаи 1,2 идентичны, а 3,4 идентичны. Если вам нужно установить свойство вашего текущего класса, вы должны сделать это одним из следующих методов:
self.myArray = otherArray;
[self setMyArray:otherArray];
строка myArray = otherArray
будет устанавливать только iVar, но не свойство.
Вторая часть, вы спрашиваете об управлении памятью. Шаг первый: прочитайте Руководство Apple . Это действительно требуется чтение. Не беспокойтесь, если вы не совсем понимаете, продолжайте читать его раз в месяц, и в конце концов он кристаллизуется.
Шаг второй: запомните это правило: если вы alloc
, copy
, new
или retain
объект, вы несете ответственность за освобождение этого объекта, если вы этого не сделаете, он будет утечка.
Во всех других случаях вы не несете ответственности за освобождение объекта, но в конечном итоге он будет освобожден. Если вам нужно сохранить его, вам нужно retain
(и, конечно, выпустить его позже).
Возвращаясь к вашему примеру, в первых двух случаях, если вы не сохраните myArray
, он будет выпущен в какой-то момент после этого блока кода. Если вы попытаетесь отправить этот объект позже, вы получите ошибку. Во вторых двух случаях, если вы не отпустите объект myArray
в какой-то момент, он будет пропущен.
Обновление 1
Очень большая разница. Две строки полностью отличаются. В синтаксисе точек важно понимать, что эти две строки в точности эквивалентны:
self.myArray = otherArray;
[self setMyArray:otherArray];
Обратите внимание, что вторая строка - это вызов метода. Теоретически вы можете поместить все, что вы хотели в этом методе. Вы можете установить myArray
на ноль, или установить someOtherArray
, или обновить твиттер или что-то еще.
Обновление 2
Да, указатели в Obj-C инициализируются в ноль.
Обновление 3
Именно так. Если свойство myArray
объявлено как retain
и вы используете синтезаторы по умолчанию, это приведет к утечке памяти.
Обновление 5
Точно так же.