Первый синтаксис правильный и будет работать правильно, несмотря на предупреждение.Компилятор предупреждает вас, потому что он не может проверить тип объекта, который вы вызываете 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:
.