Почему моя переменная экземпляра ведет себя так странно? Я правильно понял? - PullRequest
0 голосов
/ 29 апреля 2009

Чтобы опробовать некоторые вещи с указателями, я создал переменную экземпляра в существующем проекте. Это просто объявлено так:

@interface PointerFun : NSObject {
    NSString* test;
}

У меня нет директивы компилятора @property, нет @synthesize, поэтому нет геттера и сеттера. Просто для тестирования.

Тогда у меня есть метод, в котором я пробую некоторые вещи с помощью указателей и этой переменной экземпляра. На самом деле я хотел проверить, что произойдет, когда я назначу этой переменной экземпляра объект NSString (или любой другой объект), а после назначения объекта назначу другой объект этому указателю, который я назначил экземпляру var. Я думал, что это изменит объект в экземпляре var как weell.

Так вот мой код:

NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];

test = str2; // assign directly to instance variable (bad thing, just for testing!)
str2 = str1; // now lets be really mean and change the object from that pointer!!

NSLog(@"test: %x, %@", test, test); // test: 52cb10, two
NSLog(@"str1: %x, %@", str1, str1); // str1: 52ca60, one 
NSLog(@"str2: %x, %@", str2, str2); // str2: 52ca60, one

Как вы видите, переменная экземпляра продолжает указывать на объект NSString, который был раньше str2. Поэтому, когда я назначил str1 для str2, я присвоил значение str1 для str2, который является адресом памяти. Поэтому я сделал так, чтобы оба указателя имели одинаковое значение, верно?

Но когда я назначил для проверки значение str2, test принял значение из str2, которое в то время было адресом памяти для объекта «two». Так что даже если я изменю после этого присвоения значение указателя str2, это не повлияет на значение переменной экземпляра. И поскольку это указатель на объект NSString, он просто ведет себя так же, как если бы это был str1 или str2. Нет разницы только потому, что это экземпляр var. Это просто переменная, или лучше: это просто указатель. Я правильно понял? фу;) ... надеюсь, что так!

1 Ответ

4 голосов
/ 29 апреля 2009

Три переменные на самом деле являются указателями (test, str1 и str2), и у вас есть 2 созданных объекта: «один» и «два».

Когда вы делаете:

test = str2;

вы делаете контрольную точку для объекта "два", а когда вы делаете:

str2 = str1;

вы указываете str2 на объект «один», что никак не влияет на тестирование.

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