Objective C Метод экземпляра Справка * Начинающий *

Не могли бы вы, ребята, помочь мне понять концепцию очень быстро, у меня возникли проблемы с пониманием преобразования из C в Objective-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 ответа

Решение

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

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

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

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

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

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

да

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

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

Прежде всего, вам следует взглянуть на основную документацию 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, для любого класса.

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

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

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

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

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

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

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

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

id как void * в C.

Другие вопросы по тегам