将CGRect作为属性值?

时间:2010-06-04 06:01:07

标签: iphone objective-c

CGRect类型是一种结构类型。如果我想将属性定义为此类型,我应该为此类型使用assign或retain属性吗?

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

或者我必须自己编写getter和setter?

2 个答案:

答案 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)在幕后做的事情。