Результаты изменения свойства экземпляра после того, как этот экземпляр был передан другому классу? - PullRequest
0 голосов
/ 14 октября 2011

Я знаю, это основные вещи.Но я все время путаюсь с этим.

Итак, скажем, у меня есть класс HolderClass со свойством NSString с именем changeMe.

У меня есть другой класс с именем PassedToClass, и у него есть методкоторый принимает экземпляр HolderClass в качестве параметра, и внутри этого метода он использует этот экземпляр HolderClass для установки свойства holderInsideOtherClass.

Я собираюсь передать экземпляр holderClass в экземпляр PassedToClass следующим образом:

HolderClass *demonstrationHolder= [HolderClass new];
PassedToClass *passToMe = [PassedToClass new];

demonstrationHolder.changeMe = @"FirstString";

[passToMe arbitraryMethodThatTakesAHolderClass: demonstrationHolder];

Теперь, после того, как это сделано, я могу проверить значение changeMe внутри обоих классов:

NSLog (@"%@", demonstrationHolder.changeMe);
NSLog (@"%@", passToMe.holderInsideOtherClass.changeMe);

И оба из них должны распечатать "FirstString".

Но что теперь произойдет, если я сделаю это:

[demonstrationHolder.changeMe = @"SecondString"];

NSLog (@"%@", demonstrationHolder.changeMe);
NSLog (@"%@", passToMe.holderInsideOtherClass.changeMe);

Я знаю, что должен знать это уже, но кто-нибудь может помочь?

Ответы [ 2 ]

3 голосов
/ 14 октября 2011

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

Поэтому, когда вы передаете demonstrationHolder в passToMe, passToMe простополучает ссылку на исходный объект.Если вы измените этот конкретный объект в любом месте , эти изменения будут отображаться для каждого фрагмента кода, который содержит ссылку на этот конкретный объект.Это тот же объект.

При работе с объектами, которые могут изменяться таким образом («изменяемые» объекты), обычно определяют свойства как copy, а не assign / retain / strong.Если это так, и вы назначаете объект этому свойству, а не просто сохраняете ссылку, создается новый объект, который является копией исходного объекта, и вместо этого сохраняется ссылка на новый объект.Это означает, что любые будущие изменения исходного объекта не будут влиять на новую копию.

0 голосов
/ 14 октября 2011
HolderClass *demonstrationHolder= [HolderClass new];

Когда эта строка кода выполняется, память выделяется для одного экземпляра HolderClass, и вы получаете указатель (HolderClass *) на этот экземпляр, который вы назначаете demonstrationHolder.

Получив указатель, вы назначаете его члену в экземпляре passToMe:

[passToMe arbitraryMethodThatTakesAHolderClass: demonstrationHolder];

Это все то же значение указателя, представленное demonstrationHolder;все это место в памяти, где существует реальный экземпляр HolderClass.

[demonstrationHolder.changeMe = @"SecondString"];

Поскольку оба указателя (demonstrationHolder и passToMe.holderInsideOtherClass) указывают на один и тот же экземпляр, когда вы используете любой из нихчтобы получить доступ к экземпляру HolderClass, вы модифицируете тот же объект в памяти.Следовательно:

NSLog (@"%@", demonstrationHolder.changeMe);
NSLog (@"%@", passToMe.holderInsideOtherClass.changeMe);

Обе эти строки будут записывать "SecondString".

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