我正在尝试访问实现文件中的对象,其中方法如下所示:
- (Boolean)humanIsAlive:(id)humanobj;
但是,Xcode抱怨没有这样的对象,并且构建失败。
在主文件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之外的所有东西都抱怨这个对象中不存在这样的属性,并且不存在这样的对象。
帮助?
答案 0 :(得分:1)
类型为id
的对象上的属性无法安全地解析为任何一个对象上的实例方法,因此语言禁止它们。此外,如果您可以向id
本身添加属性,我们会使用一种搞砸的语言。
您需要做的就是更具体:
- (BOOL) humanIsAlive:(MyHuman*)humanobj { //... }
如果您绝对需要处理两种不同类型的对象,请稍微安全一点并使用-isKindOfClass:
,然后在适当的位置投射对象以使用它的属性。