对于“看起来”属性的方法,@ property和getter / setter有什么区别?

时间:2013-02-05 14:11:26

标签: ios properties setter getter

我理解关键的差异/过程。属性为类变量创建getter和setter。它(现在)也使用带有_前缀的私有变量进行合成。

现在,我想要一些方法像一个属性。所以我有一个UIView子类,它有一个UILabel子视图。

我想创建两个方法- (NSString *)textsetText:(NSString *)text,以便设置和获取UILabel的文本。

显然这就像一个属性一样行动(你可以做[myCustomElement text][myCustomElement setText:@"whatever"])所以我感觉就像我应该定义一个属性一样,但它会有什么用处,如果有的话?

我的吸气剂和制定者将如下所示:

- (NSString *)text {
    return self.textLabel.text;
}

- (void)setText:(NSString *)text {
    self.textLabel.text = text;
}

6 个答案:

答案 0 :(得分:4)

你可以这样做,但我不鼓励你这样做。让方法看起来像标准访问器方法(getter和setter),但实际上更新UI控件只会成为未来混乱的根源。当方法执行不符合传统实践的函数时,这只会破坏代码的可读性。另外,您已经为textLabel拥有了一个属性,因此这些方法并不会为您带来太多收获。

顺便说一句,标准的自动生成的访问器方法提供了其他有用的功能(根据您在定义属性时指定的限定符进行必要的内存管理,为将来某个日期启用key value observation可能需要这样的功能等),所以除非你是这些概念的专家,否则我会谨慎地用自己的方法替换它们。

如果您正在使用与标准访问器方法不同的东西,我建议使用不太可能成为混淆源的方法名称。

答案 1 :(得分:1)

text已经是 yourCustomElement 属性 textLabel 的属性(称为 text )(这就是您使用点符号 yourCustomElement访问它的原因.textLabel.text

在这个例子中,text属性的getter / setter应该/只能在textLabel类中

这两种方法只是设置/获取属性属性的便捷方法(很好,但它们不是getter / setter,不应该看它们)

答案 2 :(得分:1)

我认为对于您的具体示例,不定义属性是好的。

属性(据我所知)可提供方便的短线,确保在引擎盖下正确保留/释放(适当时)。

http://useyourloaf.com/blog/2011/02/08/understanding-your-objective-c-self.html

答案 3 :(得分:1)

  

这有什么用处,如果有的话?

有许多用途

1)您可以使用属性执行一些计算,更新对象的状态或某些缓存等内容。

2)您是否听说过Cocoa中的键值编码(KVC)键值观察(KVO)?它们取决于属性。检查:KVC Programming GuideKVO Programming Guide

3)使用属性可以在访问器中放置一些内存管理代码。

答案 4 :(得分:0)

如果将其声明为属性并覆盖getter / setter,则可以使用点表示法来更改或检索值。

例如:

myCustomElement.text = @"whatever";

答案 5 :(得分:-1)

长篇小说:@synthesis生成getter和setter。因此,使用合成可以节省您的输入。

但您的代码与@synthesis textLabel不同,因为您的代码只允许更改标签文字。 @synthesis将允许更改所有属性。

以下是有关@synthesis / getters / setters

的一些有用信息

http://useyourloaf.com/blog/2012/08/01/property-synthesis-with-xcode-4-dot-4.html