搜索互联网似乎有一个关于如何以最佳方式访问属性的大讨论。有些人似乎更喜欢点符号,有些人似乎对点的使用完全反感。作为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
很抱歉,如果这是一个非常主观的问题,但我非常希望得到您的意见!
TO SUMMARIZE:
所有这些都是“最佳实践”。选择你认为最漂亮的代码行并坚持下去。
答案 0 :(得分: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
答案 1 :(得分:0)
我更喜欢使用这种表示法[self.myLabel setHidden:YES];
只是为了在我的代码中明确说明我为某些事情设置了一个值。
在性能方面,它们之间确实没有太大区别。它取决于你
答案 2 :(得分:0)
我所看到的是使用点符号表示属性,因此您可以使用
self.myLabel.hidden = YES;
答案 3 :(得分:0)
一切都是好的做法。
但最佳做法取决于您的选择。
虽然您忘了在列表中再提一次。
_myLabel.hidden = YES;