Это C. То, что вы говорите, верно для каждой отдельной переменной, будь то локальная переменная или переменная экземпляра. Одно дело объявить хранилище для переменной (это все, что вы делаете, объявив недвижимость). Это другое, чтобы придать этому значение. Это объявление в коде:
NSMutableArray* arr;
... не заставляет arr
принимать какое-либо конкретное значение (в ARC это ноль; до ARC это может быть что угодно). Это, конечно, не пустой изменяемый массив! Но это точно аналогично тому, что вы делаете, когда объявляете свойство.
Если это первое значение, которое должна принимать переменная, это называется инициализация. Вы можете сказать в коде:
NSMutableArray* arr = [NSMutableArray array];
Но вы не можете сделать это в объявлении свойства, поэтому вам придется инициализировать его позже, пока выполняется код. Типичный подход заключается в том, чтобы сделать это в указанном вами инициализаторе, чтобы независимо от того, что произойдет позже, с самого начала по этому адресу будет существующий массив.
Я написал книгу на эту тему (программирование на iOS), и главу, посвященную вашей проблеме, можно прочитать в Интернете:
http://www.apeth.com/iOSBook/ch03.html