2010-06-04 75 views
8

CGRect類型是一種結構類型。如果我想將屬性定義爲此類型,我應該使用此類型的assign或retain屬性嗎?CGRect var作爲屬性值?

@interface MyClass { 
    CGRect rect; 
    ... 
} 
@property (nonatomic, assign) CGRect rect; // or retain? 

或者我必須寫我自己的getter和setter?

回答

17

只有assign可用於非對象。 (ARC,包括的CoreFoundation東西之前,例如CFArrayRef只能是assign)。

@property (nonatomic, assign) CGRect rect; 
//       ^^^^^^ don't forget. 

你並不需要一個自定義的getter和setter,除非你不想使用memcpy進行分配。

+0

謝謝。我是否需要有自己的設置來分配代碼中的字段? – 2010-06-04 06:14:31

+0

@David:如果是CGRect,按字段分配字段相當於'memcpy'。 – kennytm 2010-06-04 06:26:57

+0

你怎麼設置矩形...它令我困惑 – Morkrom 2013-08-20 18:41:15

1
@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)在幕後做了些什麼。

+0

這很有道理。仍然不確定生成的代碼執行分配,內存或逐字段是什麼?我編輯了我的問題。 – 2010-06-04 06:13:19