2

在互联网上搜索似乎有关于如何以最佳方式访问属性的大量讨论。有些人似乎更喜欢点符号,有些人似乎完全厌恶点的使用。作为 Objective-C 和 cocoa 的新手,如果有人能告诉我以下哪一项在您的经验中应该被视为“最佳实践”,我将不胜感激。

@interface MyViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *myLabel;
@end

以下哪一项应被视为最佳实践访问例如“隐藏” - UILabel 的属性?

1

self.myLabel.hidden = YES;

2

[self.myLabel setHidden:YES];

3

[[self myLabel] setHidden:YES];

4

[self myLabel].hidden = YES;

5

以上所有,但自动合成_myLabel

对不起,如果这是一个非常主观的问题,但真的很想听听您的意见!

总结:

都是“最佳实践”。选择你认为最漂亮的代码行并坚持下去。

4

4 回答 4

3

如果有人好奇:1-4 人都做同样的事情。具体来说,他们使用 getter 和 setter。5 是直接访问——它不使用 getter/setter。

我的建议是接受点表示法是消息传递,而消息传递几乎总是您与对象交互的方式,所以只需使用点表示法即可。

选择器匹配可以用点表示法更强:

// ARC
NSURL * url = nil;

NSObject<NSFilePresenter>* presenter = nil;
url = [presenter presentedItemURL]; // << match
url = presenter.presentedItemURL; // << property matched to presenter's method

NSObject * object = nil;
url = object.presentedItemURL; // << ERROR object/selector mismatch
url = [object presentedItemURL]; // << ERROR object/selector mismatch

id untyped = nil;
url = untyped.presentedItemURL; // << ERROR object/selector mismatch (Good compiler)
url = [untyped presentedItemURL]; // << OOPS, vague selector matched

因此,您通过使用点符号引入的增强类型安全性可以节省您的维护以及未来的错误。

您不太可能将它与成员访问混淆,除非您认为您正在处理一个结构(或 C++ 类),并且有许多编译器检查会警告您直接 ivar 访问。

应避免直接访问(例如_myLabel.prop和)(除了少数极端情况)。self->_myLabel.prop这条规则的例外是在部分初始化的状态下——在你的初始化器中-dealloc,你应该使用直接访问,并且你不应该使用访问器方法。

当然,还有其他地方读起来不错:

return array.count; <<< OK - clear, although not strictly a @property

......你可以走得太远:

NSString * string = NSString.alloc.init; <<< GROSS! you will not make friends using this
于 2013-03-05T12:23:56.677 回答
0

我更喜欢使用这种表示法[self.myLabel setHidden:YES];,只是为了在我的代码中清楚地表明我正在为某些东西设置一个值。

就性能而言,它们之间并没有太大的区别。由你决定

于 2013-03-05T12:14:04.093 回答
0

我所看到的是对属性使用点表示法,所以你会使用

self.myLabel.hidden = YES;
于 2013-03-05T12:14:45.820 回答
0

都是很好的做法。

最佳实践取决于您的选择。

尽管您忘记在列表中再提及一个。

_myLabel.hidden = 是;

于 2013-03-05T12:17:27.930 回答