0

Objective Cのドキュメントでは、プロパティの保持属性について次のように述べています。

割り当て時にオブジェクトに対して保持を呼び出す必要があることを指定します。(デフォルトは assign です。) 以前の値はリリース メッセージで送信されます。

UITableViewCellリファレンスガイドで次のようなものを見るまで、プロパティと属性を理解していると思っていました。

@property(nonatomic, readonly, retain) UIImageView *imageView

その後、上記を読んで本当に混乱しました。

私の質問:

1)私が持っていると仮定します:

@interface SomeClass: NSObject {
   NSString *b;
}
@property (nonatomic,retain) NSString *b;
@end

次に、実装ファイルで:

@implementation SomeClass
@synthesize b;

- (id) initWithSomeString(NSString *c) {
    if (self = [super init]) {
        b = c;
     }
}
@end

これは、「b」が指すオブジェクトの保持カウントをインクリメントしません。正しいですか? Objective C docが次のように述べているため、私はこれについて混乱しています。

割り当て時にオブジェクトに対して保持を呼び出す必要があることを指定します。(デフォルトは assign です。) 以前の値はリリース メッセージで送信されます。

2) 上記が正しい場合、retain 属性は、setter が正しく呼び出されたときにのみ保持カウントをインクリメントしますか?

3) オブジェクトのセッター メソッドを独自のイニシャライザで呼び出すのは良くないという話をいくつか聞いたことがあります。なんで?私にとって、それをするのが良くない場合は、次のことを行う必要があります。

NSString *b = [someOtherString retain];

からプロパティを作成したことを考えると、これは奇妙に思えますb

4)上記@property (retain, readonly) SomeObject *t;の例の likeUITableViewCellも紛らわしいです。「読み取り専用」は、ゲッターが合成されていないことを意味します。「保持」に関する私の理解が正しければ (つまり、セッターでのみ発生する)、これは本当に矛盾しているように見えます。

4

1 に答える 1

0

b=c; 保持カウントをインクリメントしませんが、

自己.b=c; 保持カウントを増やします。

2) はい、2 番目はセッターを呼び出すため、保持カウントがインクリメントされます。1 つ目は、プリミティブな C 割り当てです。

3)実際には、次のようにする必要があります。

b = [someothestring copy];

インスタンス変数へのアクセスをオーバーライドするローカルを宣言し、(過剰に保持された) オブジェクトを割り当て、この関数を終了するときにリークしました。

4) 内部的にオブジェクトが保持されるため、保持します。読み取り専用。このクラスを使用するコードはそのフィールドを設定できず、クラスだけが設定できるためです。

于 2010-10-24T04:39:33.520 に答える