0

重複の可能性:
ARCのinitメソッドでself.propertyを参照する必要がありますか?

私はObjective-Cを初めて使用しますが、(C#とCとは)異なるすべてのものに頭を悩ませようとしています。私は自分のプロジェクトでARCを使用しています。

私がそのようなコンストラクターを持っているとしましょう:

-(id)initWithPriority:(NSNumber *)x1 Value:(id)y1

そして、2つの(強力な)(合成された)プロパティ(x2、y2)があります。私が行った場合:

_x2=x1;
_y2=y1;

(プロパティの通過をスキップし、合成されたivarにアクセスするだけです)ではなく

x2=x1;
y2=y1;

ARCは引き続き機能しますか(保持カウントを維持するように)?

4

3 に答える 3

4

インスタンス変数を直接設定し、アクセサを使用しません。ARC は参照カウントを実行します。

注: また、初期化子の実装でプロパティのセマンティクスを保持する必要があります。たとえば、 を宣言した場合copy、パラメータのコピーをイニシャライザの ivar に割り当てます。


追加資料:

ARC の init メソッドで self.property を参照する必要がありますか?

プロパティの初期化、ドット表記

于 2012-11-09T23:34:27.600 に答える
3

ARC は割り当てに基づいて動作します。そうでなければ無意味です。(プロパティを介してのみ操作する必要がある場合、ARC の前に存在していたものには何も追加されません。) そうです、ivar に直接割り当てると、割り当てられた値は自動的に保持されます。

また、それが ivar である場合は、 ivar に直接割り当てる必要があります。これは、 の間、オブジェクトがまだ完全に状態に対応していないためです。そのため、 では、 ivar への割り当てを直接 ivarに対して実行します。アクセサー/プロパティを使用しないでください。例:init...init...

- (id) initWithName: (NSString*) s { 
    self = [super init]; 
    if (self) {
        self->_name = [s copy]; //
    }
    return self; }

ただし、スーパークラスのプロパティに割り当てることはできます。したがって、これが UIViewController サブクラスである場合、割り当てself.titleは問題ありません。

ARC の仕組みの完全な説明については、私の本を参照してください。

http://www.apeth.com/iOSBook/ch12.html

于 2012-11-09T23:34:57.207 に答える
3

はい、インスタンス変数を直接割り当てることができます。

ARC がなければ、オブジェクトを保持する必要があります。

[_x1 release];
_x1 = [x1 retain];

ARC では、インスタンス変数を割り当てるだけです。

_x1 = x1;
于 2012-11-09T23:35:15.973 に答える