Инициализация нескольких иваров одного типа с одним и тем же объектом? - PullRequest
1 голос
/ 27 сентября 2011

Итак, это довольно стандартное управление памятью, насколько я понимаю:

 ClassName *temp=[[ClassName alloc] init];
 self.ivar=temp;
 [temp release];

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

 self.ivar=[[ClassName alloc] init];

Классно.Но предположим, у меня есть несколько иваров, основанных на ClassName?Это нормально:

 ClassName *temp=[[ClassName alloc] init];
 self.ivar=temp;
 self.othervar=temp;
 self.anothervar=temp;
 [temp release];

В конечном итоге они все будут манипулировать одним и тем же объектом, даже если я хочу, чтобы у них были разные экземпляры ClassName?Я предполагаю, что результат этого может зависеть от того, были ли ивары созданы как retain против copy?Предположим, они установлены на retain, это будет хорошо?

Ответы [ 3 ]

2 голосов
/ 27 сентября 2011

В конечном счете, все ли они будут манипулировать одним и тем же объектом, даже если я хочу, чтобы они имели разные экземпляры ClassName?

ожидание по умолчанию - "да, они будут ссылаться на одно и то же".объект, потому что это система подсчета ссылок. "

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

не может , но полностью .если свойство объявлено copy и тип принимает NSCopying, это должно быть все, что нужно.если вы реализуете сеттеры (которые часто являются синтезированными свойствами) самостоятельно, вы должны copy в своих реализациях.

Предположим, они настроены на сохранение, это будет хорошо?

тогда они все будут ссылаться на один и тот же экземпляр.правильная ли это семантика для вашей программы, зависит от того, как вам нужно ее вести.в этом примере вы заявили: «Я хочу, чтобы у них были разные экземпляры ClassName», поэтому вам необходимо либо создать уникальный экземпляр для каждого пункта назначения (либо напрямую, либо через copy, если ClassName принимает NSCopying).

0 голосов
/ 27 сентября 2011

В вашем примере все объекты будут указывать / манипулировать одним и тем же экземпляром объекта, если они не являются

copy / mutableCopy

или любым другим типом, соответствующим протоколу NSCopying.

retain не окажет никакого влияния, кроме увеличения retainCount уже выделенного объекта.

0 голосов
/ 27 сентября 2011

Если все свойства retain, то вы будете хранить один и тот же экземпляр три раза, как и предполагалось.Если вам нужны разные экземпляры и вы хотите использовать retain, вам нужно создать три разных экземпляра.copy создаст копию, но затем будет делать это каждый раз, когда вы устанавливаете что-либо для свойства, что может не соответствовать вашему желаемому поведению.

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