0

メソッドが次のようになっている実装ファイル内のオブジェクトにアクセスしようとしています。 - (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以外のすべてが、このオブジェクト内にそのようなプロパティが存在せず、そのようなオブジェクトが存在しないと不平を言っています。

ヘルプ?

4

1 に答える 1

1

タイプを持つオブジェクトのプロパティはid、1つのオブジェクトのインスタンスメソッドに安全に解決できないため、言語によって禁止されています。さらに、それ自体にプロパティを追加できれば、id1つの言語が台無しになります。

あなたがする必要があるのはより具体的です:

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

2つの異なるタイプのオブジェクトをどうしても処理する必要がある場合は、もう少し安全-isKindOfClass:に使用してから、適切な場所にオブジェクトをキャストして、そのプロパティを使用します。

于 2013-03-26T20:35:55.027 に答える