Objective C Метод экземпляра Справка * Начинающий * - PullRequest
0 голосов
/ 09 февраля 2012

Можете ли вы, ребята, помочь мне понять концепцию очень быстро, у меня возникли проблемы с пониманием преобразования из C в цель-C:

Если бы у меня был конкретный метод экземпляра, который выглядит следующим образом:

-(void)addOwnerNamesObject:(NSString *)n; 
{
    // ownerNames defined as NSMutableSet
    [ownerNames addObject:n];
}

Я понимаю несколько вещей ...

  1. Это метод экземпляра, который может вызываться программой.
  2. В C это ничего не вернет (просто выполните код в curlies)
  3. В C синтаксис немного менее запутан - (void)InstanceMethod(Char *nameOfArgument)

Здесь мне нужна помощь:

  1. Когда вы вызываете этот метод, вы все еще отправляете ему аргумент?
  2. Если это так, является ли этот аргумент NSString экземпляром, который метод называет n?

И наконец ... не по теме

Если у вас есть метод ...

-(id)someMethod:(NSString *)pn
{
}
  1. Для чего (id)? это говорит компилятору, что он может вернуть объект любого типа?

Спасибо за помощь новичку ... Очень признателен.

Ответы [ 4 ]

5 голосов
/ 09 февраля 2012

Прежде всего, вам стоит взглянуть на базовую документацию Objective-C .

В Objective-C методу может предшествовать знак + или -.

+ для методов класса, - для методов экземпляра.

Тогда у вас есть тип возвращаемого значения, внутри скобок и имя метода.

- ( int )foo;

Метод экземпляра с именем foo, возвращающий int.

Аналогичная функция C будет:

int foo( void );

В Objective-C имя метода немного особенное, когда у вас есть аргументы.

Например:

- ( int )foo: ( double )num;

Метод-член с именем foo:, возвращающий int и принимающий double аргумент с именем num.

Аналогичная функция C:

int foo( double num );

Теперь с несколькими аргументами:

- ( int )foo: ( double )num1 bar: ( float )num2;

Метод-член с именем foo:bar:, возвращающий int и принимающий double аргумент с именем num1 и float аргумент с именем num2.

Аналогичная функция C:

int foo( double num1, float num2 );

По поводу вашего вопроса на id, это просто тип возвращаемого метода.

id - это typedef, используемый для экземпляров Objective-C.
По сути, это void *.

id действительно представляет указатель на объект Objective-C для любого класса.

1 голос
/ 09 февраля 2012

Чтобы добавить к этим очень действительным ответам, уже даным, дальнейшее обсуждение id:

Объекты в Objective-C не имеют типов, что означает, что на фундаментальном уровне вам не нужно знатьтипа, чтобы иметь возможность говорить с объектом.Это одно из больших различий между Objective-C и, скажем, C ++.

Обычно указываются указатели на объекты, например NSString *, чтобы сделать код более читабельным и указать ваши намерения компилятору, чтобыон может выдавать подходящие предупреждения, если вы делаете что-то странное.

id - указатель на тип без типа.Любой тип объекта может быть передан как id, а любое значение id может быть присвоено любому указателю объекта без приведения.

99,99% времени, id можно заменить на NSObject * с 99,99% объектов наследуется от NSObject, что означает, что вы можете использовать факт наследования вместо факта объектов без типов для общей передачи вещей.Однако NSObject является немного особенным в том смысле, что является одновременно и объектом, и протоколом, и некоторые объекты на самом деле не являются подклассами NSObject - NSProxy, и классы, представляющие блоки, сразу приходят на ум.Вы редко будете особенно интересоваться этими особыми случаями, но, тем не менее, id часто используется как соглашение, потому что люди предпочитают семантику передачи объекта без указания его типа передаче объекта с известным предком.

1 голос
/ 09 февраля 2012

Вы уже знаете, о чем говорите.

1.) Когда вы вызываете этот метод, вы все еще отправляете ему аргумент?

да, что бы не было после двоеточия

добавить несколько двоеточий для передачи дополнительных параметров ...

-(void)addOwnerNamesObject:(NSString *)n withSomeIntYouWantToPass:(int)value;

2.) Если это так,является ли этот аргумент экземпляром NSString, который метод называет 'n'?

yes

3.) Для чего (id)?Означает ли это, что компилятор может вернуть объект любого типа?

да, вы вернете NSObject или подкласс NSObject

1 голос
/ 09 февраля 2012

Сначала дефис (-) в имени метода говорит, что это метод instance , что означает, что вам нужен экземпляр для отправки этого сообщения.Вызов будет выглядеть примерно так:

NSString * s = @ "строка";[someInstance addOwnersNameObject: s];

В этом случае вы передаете экземпляр NSString s в сообщение addOwnersNameObject.

id походит на void * в C.

...