我理解关键的差异/过程。属性为类变量创建getter和setter。它(现在)也使用带有_
前缀的私有变量进行合成。
大
现在,我想要一些方法像一个属性。所以我有一个UIView
子类,它有一个UILabel
子视图。
我想创建两个方法- (NSString *)text
和setText:(NSString *)text
,以便设置和获取UILabel的文本。
显然这就像一个属性一样行动(你可以做[myCustomElement text]
和[myCustomElement setText:@"whatever"]
)所以我感觉就像我应该定义一个属性一样,但它会有什么用处,如果有的话?
我的吸气剂和制定者将如下所示:
- (NSString *)text {
return self.textLabel.text;
}
- (void)setText:(NSString *)text {
self.textLabel.text = text;
}
答案 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 Guide和KVO 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