使用@property和@synthesize(cocos2d)的功能

时间:2011-11-16 02:04:51

标签: objective-c cocos2d-iphone

我在库中看到使用cocos2d奇怪的@property和@synthesize

示例中的标准如下:

in .h

CGFloat minimumTouchLengthToSlide; 
}
@property(readwrite, assign) CGFloat minimumTouchLengthToSlide;

in .m

@synthesize minimumTouchLengthToSlide

但是在lib https://github.com/cocos2d/cocos2d-iphone-extensions/tree/master/Extensions/CCScrollLayer和另一个libs \ extensions

in .h

CGFloat minimumTouchLengthToSlide_; 
}
@property(readwrite, assign) CGFloat minimumTouchLengthToSlide;

in .m

@synthesize minimumTouchLengthToSlide = minimumTouchLengthToSlide_;

这段代码是什么意思?

为什么他们将minimumTouchLengthToSlide更改为minimumTouchLengthToSlide_并添加了minimumTouchLengthToSlide = minimumTouchLengthToSlide _;

2 个答案:

答案 0 :(得分:2)

将实例变量命名为与属性不同,通常认为这是一种很好的做法。这背后的共鸣是,在这种情况下,您不能意外地使用实例变量而不是属性。在使用诸如整数和浮点数之类的值类型时,这并不重要,但在retain属性上使用引用类型时更为重要。考虑一个属性

@property (nonatomic, retain) NSString *myString;
...
@synthesize myString;

编译器负责在执行self.myString = someString时保留字符串。但是当你写myString = someString时,你实际上并没有使用该属性而是直接使用该变量,并且不会发生任何保留。这可能导致僵尸,泄漏等。通过为实例变量赋予不同的名称,如下所示:

@property (nonatomic, retain) NSString *myString;
...
@synthesize myString = myString_;

您无法再编写myString = someString,因为这会发出编译错误。如果你需要直接使用实例变量,你总是可以写_myString = someString,但实际上很少需要它。

在编写显式属性方法时还有其他情况,但问题基本相同,在使用第二个变体时,不能意外地绕过属性方法。

所以基本上这是一种在处理属性时避免不必要的错误的方法(主要是retain-properties)。

答案 1 :(得分:0)

@property@synthesize是Objective-C的一个非常酷的功能,允许自动创建getter和setter方法。在您的示例中,他们将创建:

- (CGFloat)minimumTouchLengthToSlide

- (void)setMinimumTouchLengthToSlide:(CGFloat)newLength;免费。

@synthesize minimumTouchLengthToSlide = minimumTouchLengthToSlide_表示他们告诉Objective-C当有人试图访问该属性时,它应该指向实例变量minimumTouchLengthToSlide_

readwrite,assign描述当有人设置属性时会发生什么。分配意味着不保留该值,该变量只是指向。该方法可能是这样的一个例子:

- (void)setMinimumLengthToSlide:(CGFloat)newLength {
    [self willChangeValueForKey:@"minimumLengthToSlide"]; // let observers know this property is changing
    minimumLengthToSlide_ = newLength;

    [self didChangeValueForKey:@"minimumLenghtToSlide"];
}

您可以详细了解here.