CGRect类型是一种结构类型。如果我想将属性定义为此类型,我应该为此类型使用assign或retain属性吗?
@interface MyClass {
CGRect rect;
...
}
@property (nonatomic, assign) CGRect rect; // or retain?
或者我必须自己编写getter和setter?
答案 0 :(得分:17)
非对象只能assign
。 (在ARC之前,包括CoreFoundation的东西,例如CFArrayRef只能是assign
。)
@property (nonatomic, assign) CGRect rect;
// ^^^^^^ don't forget.
除非您不想使用memcpy
进行分配,否则您不需要自定义getter和setter。
答案 1 :(得分: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);
Synthesisize指令基本上为你“幕后”制作了两个方法(getter / setter);类似......
- (CGRect)rect;
- (void)setRect:(CGRect)value;
我通常在我的实例变量中添加“_”。每当rect属性被“调用”时,rect=_rect
都告诉编译器修改_rect实例var。
阅读these tutorials on Theocaco。他解释了@synthesize(r)在幕后做的事情。