CGRect類型是一種結構類型。如果我想將屬性定義爲此類型,我應該使用此類型的assign或retain屬性嗎?CGRect var作爲屬性值?
@interface MyClass {
CGRect rect;
...
}
@property (nonatomic, assign) CGRect rect; // or retain?
或者我必須寫我自己的getter和setter?
CGRect類型是一種結構類型。如果我想將屬性定義爲此類型,我應該使用此類型的assign或retain屬性嗎?CGRect var作爲屬性值?
@interface MyClass {
CGRect rect;
...
}
@property (nonatomic, assign) CGRect rect; // or retain?
或者我必須寫我自己的getter和setter?
只有assign
可用於非對象。 (ARC,包括的CoreFoundation東西之前,例如CFArrayRef只能是assign
)。
@property (nonatomic, assign) CGRect rect;
// ^^^^^^ don't forget.
你並不需要一個自定義的getter和setter,除非你不想使用memcpy
進行分配。
@property (assign) CGRect rect;
CGrect
是一個結構,而不是一個NSObject
,所以你不能將消息發送到它(如retain
)。
然後,您就完全安裝將是這樣的:
// MyClass.h
@interface MyClass : NSObject
{
CGRect _rect;
}
@property (assign) CGRect rect;
和
// MyClass.m
@implementation MyClass
@synthesize rect=_rect;
@end
所以基本上,你可以這樣做:
MyClass *myClass = [[MyClass alloc] init];
myClass.rect = CGRectMake(0,0,0,0);
的合成指令基本爲你「幕後」製作兩種方法(getter/setter);像...
- (CGRect)rect;
- (void)setRect:(CGRect)value;
我通常添加一個「_」到我的實例變量。 rect=_rect
告訴編譯器在rect屬性被「調用」時修改_rect實例var。
請仔細閱讀these tutorials on Theocaco。他解釋了@synthesize(r)在幕後做了些什麼。
這很有道理。仍然不確定生成的代碼執行分配,內存或逐字段是什麼?我編輯了我的問題。 – 2010-06-04 06:13:19
謝謝。我是否需要有自己的設置來分配代碼中的字段? – 2010-06-04 06:14:31
@David:如果是CGRect,按字段分配字段相當於'memcpy'。 – kennytm 2010-06-04 06:26:57
你怎麼設置矩形...它令我困惑 – Morkrom 2013-08-20 18:41:15