Оператор @ в Objective-C такой же, как оператор & в C? - PullRequest
2 голосов
/ 27 апреля 2011

плохо знакомы с целью C. Попытка понять указатели в Задаче C.

мой код

#import <Foundation/Foundation.h>

 int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSString *msg = @"Hello Bhai";
NSLog(@" address is %i for msg", msg);
NSLog(@" which is same address  %i for Hello Bhai", @"Hello Bhai");
NSLog(@" which is different address  %i for Hello mere Bhai", @"Hello mere Bhai");
NSLog(@" value is %@ at the address for msg", msg);


[pool drain];
    return 0;
}

вывод

[Session started at 2011-04-26 16:31:11 -0400.]
2011-04-26 16:31:11.656 BasicObjC[1523:10b]  address is 8240 for msg
2011-04-26 16:31:11.658 BasicObjC[1523:10b]  which is same address  8240 for Hello Bhai
2011-04-26 16:31:11.659 BasicObjC[1523:10b]  which is different address  8288 for Hello mere Bhai
2011-04-26 16:31:11.660 BasicObjC[1523:10b]  value is Hello Bhai at the address for msg

Означает ли это, что @ в Objective C такой же, как & в C

Ответы [ 4 ]

5 голосов
/ 27 апреля 2011

@ используется для обозначения того, что строка является литералом NSString, поэтому вы можете присвоить ее объекту NSString.

Если вы хотите напечатать какой-либо адрес, вам следует использовать спецификатор формата% p, а не% i, например,

NSLog(@" address is %p for msg", msg);
4 голосов
/ 27 апреля 2011

Означает ли это, что @ в Objective C такой же, как & в C

Нет, в этом контексте символ '@' используется для дифференцирования литерала NSString от массива C char, так что вы можете выбрать использование строк NSStrings target-c вместо строк C.

Внутри строки формата «% @» используется для получения строкового представления объекта NSObject (из метода «description»), чтобы вы могли вывести его на консоль.

Вы также столкнулись с особым поведением литералов NSString. Оба ваших строковых указателя @ "Hello Bhai" ссылаются на один и тот же адрес памяти только потому, что NSString оптимизирован, чтобы не создавать идентичные копии строковых литералов. Другие объекты не обязательно будут вести себя так же. В общем, вам не нужно знать о такой оптимизации, потому что не должно иметь никакого значения в использовании этих объектов. Если вы правильно следуете тем же правилам сохранения / выпуска и сравнения, что и с любым другим объектом, то вы никогда не заметите разницу.

2 голосов
/ 27 апреля 2011

В общем, вы увидите, что знак @ используется во многих местах в Objective-C для синтаксиса, специфичного для этого языка и, следовательно, недопустимого в «простом» C:

@implementation
@interface
@property
@selector
@class

Как отметили почти все, в данном конкретном случае, @"This is a string.", он используется для указания начала строкового литерала Objective-C. Он также используется в качестве спецификатора формата %@ для обозначения «объекта».

@ изначально был выбран для этих целей, потому что не не использовался ни для чего в C. Оператор "address-of" & совершенно допустим в Objective-C *, потому что Obj -C является надмножеством C.


* На самом деле, он довольно часто используется в Какао для косвенного возврата значений; см. например Обработка ошибок

2 голосов
/ 27 апреля 2011

Знак at (@) является чем-то совершенно отличным от оператора &.Синтаксис @"…" является сокращением для создания экземпляра NSString из символов, указанных в кавычках.

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