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
も紛らわしいです。「読み取り専用」は、ゲッターが合成されていないことを意味します。「保持」に関する私の理解が正しければ (つまり、セッターでのみ発生する)、これは本当に矛盾しているように見えます。