Obj-C: Разница между "Fairfield" и @ "Fairfield" (со строкой)? - PullRequest
0 голосов
/ 01 ноября 2009

У меня только что была нелепая опечатка в приложении для iPhone, ответил здесь .

Теперь я задаюсь вопросом о нотации @ "...".

почему это работает:

NSArray *someArray = [NSArray arrayWithObjects: @"Fairfield", nil];

а это не так (даже если он компилируется, он выдаст EXC_BAD_ACCESS):

NSArray *someArray = [NSArray arrayWithObjects: "@Fairfield", nil];

Изменить:

Хорошо, вы, ребята, отметили, что я не могу добавить строку C в NSArray, потому что это, очевидно, не объект.

Теперь другой вопрос: разве это не оплошность? Я имею в виду, почему сообщение "... WithObjects:" указывает список (id) вместо (NSObject *)?

Ответы [ 4 ]

10 голосов
/ 01 ноября 2009

"@Fairfield" - это обычная строка C с символом «@». @"Fairfield" является строкой Objective-C (NSString в OS X) без литерала @.

Вы не можете добавлять строки C в коллекции Cocoa.

4 голосов
/ 01 ноября 2009

Он принимает id вместо NSObject, потому что все инициализаторы возвращают id. Все инициализаторы возвращают id, потому что в противном случае подклассы переопределяют тип возврата инициализаторов своих предков.

Например, -[NSMutableString init] не может вернуть NSMutableString *, потому что он подклассы -[NSString init], который не может вернуть NSString *, потому что он переопределяет -[NSObject init].

К сожалению, неявное приведение типов между const char * и id совершенно допустимо, поэтому компилятор не будет выдавать предупреждение, однако статический анализатор может довольно легко подобрать такую ​​ошибку.

3 голосов
/ 01 ноября 2009

"Fairfield" - строка C, @"Fairfield" - строка Objective-C.

@"Fairfield" - это объект (NSString), поэтому вы можете отправлять ему методы ([@"Fairfield" uppercaseString]) и добавлять его в массивы Objective-C ([NSArray arrayWithObjects:@"Fairfield",nil]). Вы можете добавлять объекты только в NSArrays.

С другой стороны, "Fairfield" является строкой C и, как правило, не используется в Какао. По большей части, вы можете обойтись только с помощью @"Fairfield"

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

Другая причина, по которой некоторые вещи в Какао имеют дело с id, а не NSObject*, заключается в том, что, в отличие от некоторых других языков (например, Java и C #), где все объекты в языке должны наследоваться от некоторой глобальной базы класс, вполне возможно иметь объекты, которые не происходят от NSObject (NSProxy является одним из примеров). Это не то, что вы часто делаете, но это возможно. Тип id означает «указатель на любой экземпляр Objective C».

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