Objective-C - напрямую вызывать метод из массива объектов - PullRequest
2 голосов
/ 22 сентября 2011

Я новичок в Objective C, и я пытаюсь вызвать метод для массива (NSArray) объектов, например, так:

[[myPeople objectAtIndex: 0] setName: @"Shane"];

Но, похоже, это не работает,и возвращает предупреждение «Найдено несколько методов с именем setName»

Я могу успешно выполнить операцию следующим образом:

Person* person = [myPeople objectAtIndex: 0];
[person setName: @"Shane"];

Является ли мой синтаксис просто неверным в первом случае, илиследует ли использовать второй кусок кода?Или есть лучший способ, о котором я не знаю?

Спасибо, любая помощь очень ценится

Ответы [ 3 ]

8 голосов
/ 22 сентября 2011

Вы можете сделать это для всех объектов в массиве так:

[myPeople makeObjectsPerformSelector:@selector(setName:) withObject:@"Shane"];

3 голосов
/ 22 сентября 2011

, если вы хотите обойти предупреждение компилятора. Есть два других подхода, кроме того, который вы продемонстрировали.

Вы можете вызвать executeSelector: с объектом на нем.

[[myPeople objectAtIndex: 0] performSelector:@selector(setName:) withObject: @"Shane"];

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

if ([[myPeople objectAtIndex: 0] respondsToSelector:@selector(setName:)])

другой вариант - разыграть результат

[(Person*)[myPeople objectAtIndex: 0] setName: @"Shane"];

это должно устранить предупреждения компилятора.

3 голосов
/ 22 сентября 2011

Первый синтаксис правильный и будет работать правильно, несмотря на предупреждение.Компилятор предупреждает вас, потому что он не может проверить тип объекта, который вы вызываете setName:.

Метод objectAtIndex: класса NSArray возвращает тип id, которыйявляется общим указателем на объект Objective-C неизвестного типа.Таким образом, когда вы вызываете setName: для возвращаемого id, компилятор не знает, каков фактический класс объекта.В вашем коде есть несколько классов, которые определяют метод setName: (возможно, как синтезированный установщик для свойства с именем name), поэтому он выдает предупреждение.

Второй фрагмент кода компилируется без предупреждения, посколькутип id может быть неявно приведен к любому другому типу указателя Objective-C.Когда вы говорите Person* person = [myPeople objectAtIndex: 0];, вы берете id, возвращаемый objectAtIndex:, и приводите его (неявно) к Person*.Затем, когда вы вызываете setName: для этого Person, компилятор знает, какой у вас тип, поэтому он может проверить, что класс Person действительно реализует метод setName:.

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