我有CGSize的属性:
@property (nonatomic) CGSize descriptionSize;
@synthesize descriptionSize = _descriptionSize;
我可以通过点语法访问高度:
self.descriptionSize.height = 35;
但是如何使用括号语法?
[self setDescriptionSize:???];
对我来说看起来很愚蠢,但我无法得到线索。提前谢谢!
答案 0 :(得分:6)
这是属性点符号的缺陷之一:self.descriptionSize.height中的那两个点看起来相同但意味着非常不同的东西。第一个是属性访问器,它映射到“get descriptionSize”方法,但第二个是旧式结构引用。第一个点返回CGSize 标量 ,而不是指向对象中大小值的指针。当第二个点设置返回的CGSize中的高度时,它在堆栈上设置一个值而不是更改对象中的值。这就是你必须要做的事情:
CGSize size = self.descriptionSize;
size.height = 35;
self.descriptionSize = size;
...或没有属性点符号的等价物:
CGSize size = [self descriptionSize];
size.height = 35; // we still use the dot here: size is a struct not an object
[self setDescriptionSize:size];
答案 1 :(得分:5)
descriptionSize
的实现将返回CGSize
结构的副本,因此您无法直接使用它并希望它能够正常工作。你需要做的是获取整个CGSize
结构,修改它,然后将其传回:
CGSize size = [self descriptionSize];
size.height = 35;
[self setDescriptionSize:size];
但是,鉴于您正在处理self
的属性且该属性不是对象,这需要内存管理,修改大小的最有效方法是:
_descriptionSize.height = 35;
但是,如果出现以下情况,您将使用以前的getter / setter方法:
self
。答案 2 :(得分:2)
Dot语法可能意味着两件事:结构引用(CGSize是C结构)或Objective-C消息发送。
从理论上讲,如果您使用- (void)doSomething;
这样的方法,可以这样称呼它:myObject.doSomething; //bad style
。不要这样做。除了获取或设置值之外,Dot语法不适用于调用实际执行操作的方法(尽管语言或IDE中的任何内容都不会阻止您)。
合成属性会创建访问者方法:- (myType)myProperty
和- (void)setMyProperty:(myType)newValue
。这里,点语法允许您以普通方式访问getter(因为getter是一个普通的Objective-C方法),并且具有setter的特殊情况:myObject.myProperty = newValue
被转换为[myObject setMyProperty:newValue]
。< / p>
这意味着您可以在属性的点语法和Objective-C样式消息发送语法之间切换(技术上可以在所有其他无参数的Objective-C方法发送中切换),但必须使用点语法访问struct成员。结构不是对象,现在他们知道方法。