2

複数のメソッドに同じオブジェクトを使用する予定であるため、プログラムの実装セクションでオブジェクトを初期化しようとしています。これを行おうとするとエラーが発生しますが、その理由が不思議でした。以下にいくつかの例を示します。

@implementation Fraction {
    NSString *test = [[NSString alloc] init];
}

また

@implementation Fraction {
    int x = 0;
}

変数を初期化しない場合でも、エラーや警告なしで正常に機能します。これがコードの設計方法であると確信していますが、その理由が気になりました。ご回答ありがとうございます。

4

3 に答える 3

7

の中括弧セクションは、@implementationインスタンス変数を宣言するためだけのものです。それらを初期化したり、他のコードをそこに置いたりすることはできません。

インスタンス変数を初期化する適切な場所は、initメソッド内です。

@implementaiton Fraction {
    NSString *test;
    int x;
}

- (id)init {
    if ((self = [super init])) {
        test = @"";
        x = 0;
    }

    return self;
}
于 2012-11-23T04:04:26.057 に答える
2

中括弧で囲むことにより@implementation、定数を宣言するのではなく、iVar を宣言します。また、定数を宣言しようとしていない場合でも-init、変数に「初期値」を保持させたい場合は、初期化をフレーバー メソッドに移動する必要があります。定数を宣言しようとしていた場合は、@implementationブロックの外で行う必要があります。

于 2012-11-23T04:04:18.737 に答える
0

セクションでは、変数を初期化することは@implementationできず、変数を宣言するだけです。他のことについて- (id) initは、次のように割り当て後に論理的に呼び出されるため、メソッドを使用します[[CustomObjectClass alloc] init];。さらに、プライベート変数を宣言するには、次のように .m ファイルでクラス拡張を使用することをお勧めします。@interface CustomClassName()

于 2012-11-23T04:21:33.347 に答える