Класс копирует NSArray другого класса и владеет им отчетливо - PullRequest
1 голос
/ 30 марта 2012

Я хочу убедиться, что я понимаю ключевую концепцию свойств и владения переменной экземпляра класса, в данном случае используя NSArray.

Предположим, я передаю ссылку на NSArray другому классу, иустановите для этого класса iVar.Например:

Первая техника

OtherClass.h

@property (nonatomic, retain) NSArray * otherClassArray;

, затем:

CurrentClass.m

otherclass.otherClassArray=myArray

Теперь, даже если OtherClass сохраняет myArray, если CurrentClass изменит myArray, то otherclass.otherClassArray также изменится, верно?

Итак, это лучший способ сделать это, или я ошибаюсь, и выше все равно будет делать то, что я ожидал от следующего:

Вторая техника

CurrentClass.m

otherclass.otherClassArray=[NSArray arrayWithArray:myArray]

Теперь выполняется отдельная копия, поэтому любые изменения в myArray не влияют на otherClassArray, я прав илиоба эти подхода делают одно и то же?

ОБНОВЛЕНИЕ : Есть ли какая-то причина, по которой мой второй метод выше или не должен использоваться вместо использования copy со свойством?Казалось бы, любой из этих методов приводит к новому NSArray, которым владеет мой класс.

1 Ответ

1 голос
/ 30 марта 2012

Именно поэтому это обычно рекомендуется , чтобы свойства, классы которых имели изменяемые подклассы (прежде всего, NSString и различные классы коллекций), были объявлен как copy:

@property (nonatomic, copy) NSArray * otherClassArray;

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

Ваш второй метод имеет тот же результат, что и объявление свойства copy, да, но он должен быть оставлен на усмотрение владельца свойства, хочет ли он копию или нет. Иными словами, принцип инкапсуляция требует, чтобы клиентский код (CurrentClass) не отвечал за знание того, что OtherClass должна иметь свою собственную версию объекта. Это вопрос дизайна и ремонтопригодности.

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