将点语法转换为结构上的括号语法

bra*_*ray 4 objective-c

我有CGSize的财产:

@property (nonatomic) CGSize descriptionSize;
Run Code Online (Sandbox Code Playgroud)

"

@synthesize descriptionSize = _descriptionSize;
Run Code Online (Sandbox Code Playgroud)

我可以通过点语法访问高度:

self.descriptionSize.height = 35;
Run Code Online (Sandbox Code Playgroud)

但这如何与括号语法一起使用?

[self setDescriptionSize:???];
Run Code Online (Sandbox Code Playgroud)

看起来对我很愚蠢,但我无法得到线索.提前致谢!

dav*_*den 6

这是属性点符号的缺陷之一:self.descriptionSize.height中的那两个点看起来相同但意味着非常不同的东西.第一个是属性访问器,它映射到"get descriptionSize"方法,但第二个是旧式结构引用.第一个点返回CGSize 标量,而不是指向对象中大小值的指针.当第二个点设置返回的CGSize中的高度时,它在堆栈上设置一个值而不是更改对象中的值.这是你必须这样做的:

CGSize size = self.descriptionSize;
size.height = 35;
self.descriptionSize = size;
Run Code Online (Sandbox Code Playgroud)

...或没有属性点等号的等价物:

CGSize size = [self descriptionSize];
size.height = 35; // we still use the dot here: size is a struct not an object
[self setDescriptionSize:size];
Run Code Online (Sandbox Code Playgroud)


tro*_*foe 5

的实施descriptionSize将返回一个副本中的CGSize结构,所以你不能直接工作,并希望它会工作.你需要做的是获取整个CGSize结构,修改它,然后将其传回:

CGSize size = [self descriptionSize];
size.height = 35;
[self setDescriptionSize:size];
Run Code Online (Sandbox Code Playgroud)

但是,如果您正在处理属性self并且属性不是需要内存管理的对象,则修改大小的最有效方法是:

_descriptionSize.height = 35;
Run Code Online (Sandbox Code Playgroud)

但是,如果出现以下情况,您将使用以前的getter/setter方法:

  1. 对象不是self.
  2. 您已手动编写setter方法来执行某些操作作为更改大小的副作用(例如,使视图的位无效以自动更新视图).