我在库中看到使用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 _;
答案 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.