1

Objective-Cのプロパティに値を割り当てることに疑問があります。たとえば、次のインターフェイスを使用している場合、「不思議なことに見逃された」値の問題がたくさん発生しました。

// MyClass.h
@interface MyClass : NSObject {
    MyOtherClass *myVar;
}

@property (nonatomic, retain) MyOtherClass *myVar;

- (id)initWithValue:(NSString *)val;

そしてこの実装:

// MyClass.m
@implementation MyClass

@synthesize myVar;

- (id)initWithValue:(NSString *)val {
    self = [super init];

    if (self != nil) {
        /** Do some stuff with val... **/
        myVar = [method:val]; // Some method that returns a MyOtherClass value
    }

    return self;
}

実行のある時点で、myVarの値が消えたり、変更されたりします...そして解決策は次のように変更することです。

myVar = [method:val]; //MyOtherClass値を返すメソッド

にとって

self .myVar = [method:val]; //MyOtherClass値を返すメソッド

それで...自己を使用するか使用しないかの違いは何ですか?つまり、使用しなければならないのは明らかです。そうしないと問題が発生するからですが、理由はわかりません。

前もって感謝します

4

3 に答える 3

3

self を使用する場合は、プロパティを使用していることになり、"retain" とマークされます。変数を使用する場合、プロパティをバイパスしているため、「保持」はありません。myVar = [[someObject method:val] retain];プロパティと同じ効果を記述して取得できます。

于 2012-04-12T21:18:38.793 に答える
1

@synthesizeこれは、に変更する必要がある理由の良い例です@synthesize myVar = _myVar;。そうしないと、「myVar = nil」の直接割り当てがセッターをバイパスするため、インスタンス変数を自分の下から設定することができます。

このmyVar = _myVar戦略を使用すると、実行しようとするとコンパイラが文句を言い、セッターまたはゲッターにアクセスするmyVar =呼び出しが必要になります。self.myVar

その場合に使用する必要がある唯一の場所は_myVar、その変数のセッターまたはゲッターの宣言を変更する場合です。

于 2012-04-12T21:19:42.663 に答える
0

どのメソッドを呼び出していvalますか?

私はあなたがするときそれを想像します

myVar = [method:val]; // Some method that returns a MyOtherClass value

結果は自動解放されたオブジェクトです。つまり、initメソッドが終了すると、myVarオブジェクトが解放されて破棄されます。変数はmyVar、オブジェクトがあったメモリ内の場所を指しますが、そのメモリは何かでいっぱいになる可能性があります。

このようなドット構文を使用してプロパティセッターメソッドを使用する場合

self.myVar = [method:val];

コンパイラによって自動的に合成されるsetterメソッドは、オブジェクトを保持するための保持メッセージをオブジェクトに送信します。

次のようにコードエラーを修正することもできます。

myVar = [[method:val] retain]; // Some method that returns a MyOtherClass value

ただし、ドット構文に固執することをお勧めします。

于 2012-04-12T21:21:17.350 に答える