Почему моя переменная экземпляра ведет себя так странно?Правильно ли я все понял?

StackOverflow https://stackoverflow.com/questions/803218

  •  03-07-2019
  •  | 
  •  

Вопрос

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

@interface PointerFun : NSObject {
    NSString* test;
}

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

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

Итак, вот мой код:

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

Это было полезно?

Решение

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

Когда ты это сделаешь:

test = str2;

вы указываете тестовую точку на объект "два", и когда вы делаете:

str2 = str1;

вы заставляете str2 указывать на объект "one", который вообще не влияет на тест.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top