0

我了解关键差异/过程。属性为类变量创建 getter 和 setter。它还(现在)将它与带有_前缀的私有变量合成。

伟大的。

现在,我想要一些方法来充当属性。所以我有一个UIViewUILabel子视图的子类。

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

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

我的 getter 和 setter 看起来像这样:

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

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

6 回答 6

4

你可以这样做,但我不鼓励你这样做。拥有看起来像标准访问器方法(getter 和 setter)但真正更新 UI 控件的方法只会成为未来混乱的根源。当方法执行不符合常规做法的功能时,这只会破坏代码的可读性。再加上你已经有你的财产textLabel,所以这些方法不会给你买太多。

顺便说一句,标准的自动生成的访问器方法提供了其他有用的功能(根据您在定义属性时指定的限定符进行必要的内存管理,在您可能需要此类功能的某个未来日期启用键值观察,等),所以除非您精通这些概念,否则我不会用您自己的方法替换它们。

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

于 2013-02-05T14:24:11.253 回答
1

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

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

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

于 2013-02-05T14:23:48.073 回答
1

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

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

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

于 2013-02-05T14:24:44.217 回答
1

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

有很多用途

1)你可以使用属性来做一些计算,更新对象的状态,或者一些类似缓存的东西。

2)你听说过Cocoa 中的键值编码 (KVC)键值观察 (KVO)吗?它们取决于属性。检查:KVC 编程指南KVO 编程指南

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

于 2013-02-05T14:29:05.900 回答
0

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

前任:

myCustomElement.text = @"whatever";
于 2013-02-05T14:22:34.597 回答
-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

于 2013-02-05T14:21:35.893 回答