1

これが私が持っているものです:

@interface engine : NSObject
{

    int test;

}

@property (nonatomic, readonly) int test;

自分のクラス(エンジンクラス)内のiVarテストにvalue(10)を割り当てようとすると、デバッガーはtest = 10、および_test=0を表示します。

テストから読み込もうとすると、0が返されます。これは、値of_testを取得していると推測しています。

想定どおりに機能させるにはどうすればよいですか?外部クラスに「テスト」への読み取り専用アクセス権を持たせたいのですが、クラス内で「テスト」に値を割り当てたり、「テスト」から値を読み取ったりできますか?

または、この実装の何が問題になっていますか?

更新:自動的に実行するxcode 4.4を使用しているため、合成は行いません。合成では、プロパティと同じiVar名が使用されると思います。通常の合成を行う場合、これはとにかくデフォルトの動作です。

ありがとう。

4

3 に答える 3

1

test=10あなたのコードを見ずに言うのは難しいですが、私はあなたがの代わりにのようなことをしようとしていると推測していますself.test=10。使用するObjC/XCodeのバージョンと可能な@synthesizeステートメントに応じて、(定義されている場合は常に)ローカル変数にアクセスしますが、プロパティrespにはアクセスしません。それはiVarです。

編集

読み取り専用プロパティを作成する場合は、そのiVarを使用する必要があります。たとえば、_test=10両方の読み取りアクセスの後、self.testおよび_test(純粋ではありませんtest!)は同じ値を提供する必要があります。

于 2012-09-06T04:27:09.523 に答える
1

あなたは間違っていると思います。デフォルトの実装では、アンダーバーを使用してプロパティ名を生成します。別の名前が必要な場合は、自分で合成する必要があります。

于 2012-09-06T05:15:39.733 に答える
1

自動合成では、アンダースコアプレフィックスが付いたインスタンス変数が作成されるため、と呼ばれるプロパティはtest、のバッキングインスタンス変数を生成します_test。したがって、2つのインスタンス変数があります。test、プロパティに接続されていない、および_test。インスタンス変数に書き込む場合、それはプロパティの値testに反映されません。_test

しかし、もっと重要なことは、バッキングインスタンス変数を自分で宣言することは無意味です。これは単なる余分なコードであり、不要な冗長性です。この@property行には、タイプ、名前、読み取り/書き込みか読み取り専用か、およびストレージ修飾子がすでに含まれています。バッキングインスタンス変数の宣言を自分でスキップして、コンパイラが生成したものを使用してください。

Engine.hの場合:

@interface Engine : NSObject
@property (readonly, assign) NSInteger test;
- (void)doSomething;
@end

Engine.mの場合:

@implementation Engine

- (void)doSomething {
    _test++; // _test is created automatically by the compiler
}

@end

other.m:

Engine *engine = [[Engine alloc] init];
NSLog(@"%d", engine.test); // 0
[engine doSomething];
NSLog(@"%d", engine.test); // 1

これはすべてうまくいきます。それに追加しないでください。

于 2012-09-06T05:22:03.780 に答える