代码之家  ›  专栏  ›  技术社区  ›  David.Chu.ca

CGRect Var作为属性值?

  •  8
  • David.Chu.ca  · 技术社区  · 16 年前

    CGRECT类型是结构类型。如果要将属性定义为此类型,是否应为此类型使用assign或retain属性?

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

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

    2 回复  |  直到 12 年前
        1
  •  17
  •   kennytm    12 年前

    只有 assign 对于非对象是可能的。(在ARC之前,包括CoreFoundation的内容,例如cfarrayref只能 分配 )

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

    你不需要一个自定义的getter和setter,除非你不想使用 memcpy 用于分配。

        2
  •  1
  •   typeoneerror    16 年前
    @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);
    

    synthesis指令基本上为您“幕后”制作了两种方法(getter/setter);比如……

    - (CGRect)rect;
    - (void)setRect:(CGRect)value;
    

    我通常在实例变量中添加一个“uu”。这个 rect=_rect 指示编译器在“调用rect属性”时修改“rect实例”变量。

    通读 these tutorials on Theocaco . 他解释了@synthesize r(r)在幕后所做的工作。