0

私はこのプログラミング本を次のコードで読んでいます

#import "Fraction.h"
int main (int argc, char * argv [])
{
    @autoreleasepool {
        Fraction *f = [[Fraction alloc] init];
        [f noSuchMethod];
        NSLog (@"Execution continues!");
    }
    return 0;
}

どうやら、次の出力が得られるはずです。

* キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します

代わりに、「Fraction」の目に見える @interface がセレクター「noSuchMethod」を宣言していないというエラーが表示されます。

これは、新しいバージョンの xcode を使用しているためですか、それとも何か間違っていますか? 私にはかなり簡単に思えます。

編集:

また...この次のコードは、最新バージョンのxcodeで機能しますか?

int main (int argc, char * argv [])
{
    @autoreleasepool {
        Fraction *f = [[Fraction alloc] init];
        @try {
            [f noSuchMethod];
        }
        @catch (NSException *exception) {
            NSLog(@"Caught %@%@", [exception name], [exception reason]);
        }
        NSLog (@"Execution continues!");
    }
return 0;
}

編集#2: ここに画像の説明を入力

4

1 に答える 1

2

確かに存在しないメソッドを呼び出した場合、Xcodeではコンパイルできません。

それ以外の場合は、メソッドを使用しperformSelector:ます。

編集

最初の質問のように、メソッドを直接呼び出すとコンパイルされません。

それでも何らかの理由でこのメソッドを呼び出したい場合は、それがプライベートまたは他の何かである可能性があるため、performSelector:を介して呼び出すことができます。

それでも、オブジェクトがそれに応答しない可能性があることが通知されます。ここに表示されているように、警告を抑制することができます。

http://www.stackoverflow.com/a/7933931/1320374

于 2012-12-07T10:33:43.833 に答える