Obj C - Понимание указателей - PullRequest
2 голосов
/ 28 декабря 2008

У меня чертовски много времени понимают указатели в Objective C. Они ведут себя не так, как я предполагаю, основываясь на различных уроках C.

Пример:

// Define Name and ID
NSString *processName = [[NSProcessInfo processInfo] processName];
NSNumber *processID = [NSNumber numberWithInt:[[NSProcessInfo processInfo] processIdentifier]];

// Print Name and ID
NSLog(@"Process Name: %@  Process Identifier: %@", processName, processID);

Насколько я понимаю, processName - это указатель на объект типа NSString. processID - указатель на объект типа NSNumber. Когда оба они вызываются в NSLog (), у них нет звездочки, предшествующей их имени, и поэтому они должны возвращать значения указателя. Почему в Obj C нет символа 'address of'? Почему этот код работает?

Спасибо за ваше время.

Ответы [ 2 ]

11 голосов
/ 28 декабря 2008

Объекты в цели c представлены в виде указателей на структуры c, которые содержат все данные объекта. Если бы объект был реальной структурой (а не указателем на нее), это сделало бы такие вещи, как передача объектов в качестве параметров метода, гораздо менее эффективными. Итак, как только вы инициализируете объект:

NSString *aString = /* initial value */;

вы почти всегда будете просто использовать указатель aString, а не разыменовывать его (т.е. * aString).

Токен% @ в функции NSLog () ожидает тип указателя и вызывает метод описания для этого объекта, чтобы определить, какое значение вывести. Когда метод описания вызывается для объекта NSString, он возвращает получателя, поэтому токен% @ заменяется содержимым строки в выводе.

7 голосов
/ 28 декабря 2008

%@ в вашей строке формата указывает NSLog на -description для соответствующего объекта и использования этой строки в качестве отображаемого значения. Если вам нужен адрес указателя, вы должны использовать %x или %qx на 64-битной.

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