0

クラスのメソッドで値を割り当てる正しい規則は、セッターバージョンを使用しないことです。

次のようなinitメソッドがあるとします。

// Class header 
@property (nonatomic, weak) id <DelegateType> delegate;
@property (nonatomic, strong) NSString *stringData;

@synthesize delegate = _delegate;
@synthesize stringData = _stringData;

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate
{
    // initialization happens here
}

ARC以前では、次の方法で正しい保持ポリシーを確保します。

stringData = [aString retain];
self.delegate = aDelegate;

ARCを使用する場合、割り当てをどのように行い、ivarが早くリリースされないようにするのでしょうか。

セッターオーバーライドの場合、舞台裏でどのような作業が行われているのかわからないので、できないという印象を受けました。

self.stringData = aString

正しい初期化パターンは何ですか?

4

3 に答える 3

1

プロパティを次のように使用しているため

// Class header 
@property (nonatomic, weak) id <DelegateType> delegate;
@property (nonatomic, strong) NSString *stringData;

@synthesize delegate = _delegate;
@synthesize stringData = _stringData;

したがって、ARC によると、弱いオブジェクトはassignのように機能します。ただし、「強い」は基本的に保持のようには機能しません。保持は参照カウントを増やすだけであり、ARC では、そのクラスのインスタンスが存在するまで、強い型のオブジェクトが確実に存在するためです。

だからinitメソッドで

そのはず

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate
{
// now _stringData and _delegate are getter instance of property variables. so either you can use self.stringData and self.delegate or _stringData and _delegate.
    _stringData = aString;
    _delegate = aDelegate;
}
于 2012-08-17T18:13:22.843 に答える
0

ARCを使用した実装であっても、アクセサーを使用してivarにアクセスできます。実際、(ほとんどの場合)アクセサーを使用する必要があります。思ったより賢いです。「早すぎる」リリースの ivar はありません。

于 2012-08-17T17:35:36.353 に答える
0

ivarに割り当てるだけです。__strongARC は、変数のメモリ管理ポリシー ( 、__weakまたは)に従って保持と解放を処理します__unsafe_unretained。それがARCのポイントです。したがって、コードサンプルは次のようになります。

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate
{
    stringData = aString;
    delegate = aDelegate;
}

余談ですが、おそらくその文字列を保持するのではなく、コピーする必要があります。したがって、setter を次のように宣言する@property (nonatomic, copy) NSString *stringData;と、init メソッドの実装は次のようになります。

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate
{
    stringData = [aString copy];
    delegate = aDelegate;
}
于 2012-08-17T17:37:25.827 に答える