2013-03-26 66 views
0

我试图访问一个实现文件中的方法看起来像这样的对象: - (Boolean)humanIsAlive:(id)humanobj;但是,Xcode抱怨没有这样的对象存在,并且构建失败。objc对象指向

在主文件,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 2013-03-26 20:38:49

+0

如果你需要一种方法来处理两种不同类型的对象(这绝不应该发生在设计上),然后声明它需要一个类型为“id”的对象,然后用'-isKindOfClass:'测试它的类并且适当施放。 – CodaFi 2013-03-26 20:40:30

+0

感谢它的工作。 :) – NONE 2013-03-26 20:48:15