2013-03-26 2 views
0

Я пытаюсь получить доступ к объекту в файле реализации, где метод выглядит следующим образом: - (Boolean)humanIsAlive:(id)humanobj; Однако Xcode жалуется, что такой объект не существует и сборка завершается с ошибкой.Объект objc pointing

В главном файле, main.m, я пишу это в функции main():

int main(int argc, const char * argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    Human *human = [[Human alloc] init]; 
    MyHuman *myhuman = [[MyHuman alloc] init]; 

    [human create:@"John Doe" age:25]; 
    if ([human humanIsAlive:myhuman]) { 
     NSLog(@"%@ is alive and well.", myhuman.humanName); 
    } else { 
     NSLog(@"%@ is dead and gone.", myhuman.humanName); 
    } 

    [pool drain]; 
    return 0; 
} 

Вот код, который Xcode жалуется:

- (Boolean)humanIsAlive:(id)humanobj { 
    if (humanobj.living == YES) { 
     return YES; 
    } 
    return NO; 
} 

кажется законным и все, но Xcode жалуется что в этом объекте нет таких свойств, и такой объект не существует.

Помощь?

ответ

1

Свойства объектов с типом id не могут быть безопасно разрешены методом экземпляра на каком-либо одном объекте, поэтому они запрещены этим языком. Кроме того, если бы вы могли добавить свойства к id себе, у нас был бы один испорченный язык.

Все, что вам нужно сделать, это быть более конкретным:

- (BOOL) humanIsAlive:(MyHuman*)humanobj { //... } 

Если вам абсолютно необходимо обрабатывать два разнородные типы объектов, быть немного более безопасным об этом и использовать -isKindOfClass:, затем привести объект в надлежащих случаях использовать его свойства.

+0

То, что я пытаюсь сделать, это подождать, пока пользователь будет вводить объект и получать доступ к свойствам оттуда. – NONE

+0

Если вам нужен один метод для обработки двух разных типов объектов (которые никогда не должны возникать конструктивно), тогда объявите его, чтобы он взял объект типа 'id', а затем проверил его класс с' -isKindOfClass: 'и бросать надлежащим образом. – CodaFi

+0

Спасибо, сработало. :) – NONE