2013-03-26 92 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