Какой из следующих способов является хорошим способом инициализации - PullRequest
0 голосов
/ 02 мая 2011

Я - новый программист Objective-C и иногда путаюсь с этими концепциями владения этим языком .... в настоящее время я изучаю программирование на iPhone ....

Вот такие случаи, которые меня всегда смущали..

я обычно использую эти (иногда сначала, а иногда и другие)

 NSMutableArray *array;     //Declared in header

case 1

array1= [databaseClass getData];

Case 2

array1 = [NSMutableArray arrayWithArray:[databaseClass getData]]; 

Здесь [databaseClass getData] возвращает неавторизованный массив объектов .. Я просто хочу подтвердить, что кто-то из них является правильным?

, а если нет, то предложите правильныйone ....

EDIT

Я хочу сказать, что [databaseClass getData] уже возвращает мне выделенный массив (я имею в виду неавторизованный массив), теперь я думаю,мне не нужно выделять мой массив, если я хочу использовать его в своем классе (я проверил это, и он работает), здесь мой единственный вопрос о том, что array1 инициализация .... Кто-нибудь из этих выше утверждений делает какие-либосмысл ...... если нет, то я прошу предоставить блок кода, такчто мне становится понятнее ..... Спасибо

1 Ответ

6 голосов
/ 02 мая 2011

В обоих случаях вы должны получить объект с автоматическим выпуском. Вы владелец, если:

  • Вы выделили объект через alloc.
  • Вы создали копию объекта с помощью метода, который содержит слово copy, как в mutableCopy (возвращенная копия принадлежит вам, а не объекту, для которого вы вызвали метод copy).
  • Вы retain отредактировали это.

Во всех других случаях вы можете предполагать, что вы не владелец и вам не нужно освобождать объект.

Так что, если ваш метод getData не возвращает автоматически выпущенный объект, вы должны изменить его так, чтобы это происходило. В противном случае другие люди, использующие этот код, вызовут утечки памяти (и вы, вероятно, запутаете себя таким образом).

Редактировать после того, как вопрос отредактирован:

В соответствии с соглашением об именах в Objective-C метод getData должен возвращать объект с автоматическим освобождением. Поэтому его следует отредактировать так, чтобы он возвращал автоматически освобожденный объект, если это еще не сделано.

Если вы хотите редактировать массив, вам нужно сделать изменяемую копию из него. Вы можете позвонить [NSMutableArray arrayWithArray:[databaseClass getData]]; или [[databaseClass getData] mutableCopy]. В первом случае массив автоматически освобождается, вы не владелец и вам не нужно вызвать release для него. Во втором случае вы являетесь владельцем (в соответствии с правилом copy) и вам необходимо освободить его позже.

...