Объяснить объявление и присвоение переменной объекта - PullRequest
0 голосов
/ 02 ноября 2011

В этом фрагменте:

NSString *testString; 
testString = [[NSString alloc] init]; 

Почему во второй строке нам не нужно писать *testString = ..., чтобы получить доступ к тому месту, куда он фактически указывает?

После первой строки, что такое *testString и что такое testString?

Ответы [ 4 ]

2 голосов
/ 02 ноября 2011

На все объекты ссылаются указатели. Первая строка

NSString * testString;

объявляет переменную экземпляра. Если тип вашей переменной является объектом (кроме идентификатора типа), вам нужно *

с этого момента ссылка на testString является указателем

Если вы создаете 2 строки. Создано 2 физических объекта (в памяти)

NSString * testString = [[NSString alloc] init];
NSString * testString2 = [[NSString alloc] init];

//setting testString to testString2 will lose the pointer to testString for good

testString = testString2;  //<--bad if you still care about testString (and leaks the memory too)

Я рекомендую ознакомиться с руководством Apple по Objective-C. Конкретно этот раздел

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectivec/Chapters/ocObjectsClasses.html#//apple_ref/doc/uid/TP30001163-CH11-SW1

2 голосов
/ 02 ноября 2011

В первой строке вы создаете указатель типа NSString. Указатели в C ++ и Objective-C обозначаются символом звездочки (*) при их объявлении. Во второй строке вы говорите, что этот указатель с именем «testString» ссылается на область памяти объекта NSString, который вы выделили в памяти.

1 голос
/ 02 ноября 2011

Почему во второй строке нам не нужно писать *testString = ..., чтобы получить доступ к месту, куда он фактически указывает?

Метод init возвращает универсальныйуказатель на объект - его тип возвращаемого значения id.testString - это указатель на NSString, который является объектом, поэтому вы назначаете указатель на другой указатель.Разыменование назначенного указателя было бы несовпадением типов.

Имя переменной - это место (метка для адреса памяти), в которое нужно что-то поместить.Тип переменной - это то, что вы можете поместить туда.В случае с указателем в него вставляется , а также адрес памяти.Чтобы получить этот адрес, вы разыменовываете указатель.То, что вы можете поместить по этому адресу, отличается от того, которое вы указали в самом указателе.

После первой строки, что такое *testString и что такое testString?

После первой строки *testString или вещь, в которой testString указывает , является мусором (фактически не определенным).testString - указатель (4 или 8 байт в зависимости от вашей системы) на адрес в памяти, и он также не определен.

После второй строки *testString - это объект NSString.testString по-прежнему является указателем на адрес, где есть действительный объект NSString.

1 голос
/ 02 ноября 2011

Это просто потому, что мы влияем на указатель.

[[NSString alloc] init] возвращает указатель на строку NSString.

В Какао каждый объект распределяется динамически (как в malloc в C), и каждый NSObject управляется через его указатель / адрес (в такой точке, что многие программисты ObjC даже не знают, что они манипулируют указателями). а не предметы)

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