RE:Objective-C - When to use 'self'
我理解当SELF实际必需 100%正确设置保留属性时,是否有任何开销来连续调用getter方法,而不是直接访问你已经获得了保留的物品?该程序是否更有效不不断调用它?
您的ViewController包含许多保留的子视图(即多个保留的UIView),这些子视图将添加到根主视图中。
在 viewDidLoad:方法内部有任何开销:
[self.mySubViewA setBackgroundColor:[UIColor blueColor]];
[self.mySubViewA setOpaque:NO];
[self.mySubViewA setAlpha:1.0f];
[self.view addSubView:self.mySubViewA];
[self.mySubViewB setMyCustomPropertyInThisView:[UIColor redColor]];
....
而不是:
// no calls to SELF at all (i.e saving time on method get cycle calls and directly
// accessing the properties currently retained at that address.
// Assumption here is that mySubViewA is loaded through NIB and is already alloc'd.
[mySubViewA setBackgroundColor:[UIColor blueColor]];
[mySubViewA setOpaque:NO];
[mySubViewA setAlpha:1.0f];
// Is this faster? since we just instantly assign the UIView @ mySubViewA to the main view
// as opposed to a method get cycle?
[self.view addSubView:mySubViewA];
[mySubViewB setMyCustomPropertyInThisView:[UIColor redColor]];
....
答案 0 :(得分:1)
是的,当然有一个开销。使用self.…
表示另一个方法调用,它比简单的赋值花费更多时间。还有多少,取决于如何实现getter(例如,如果属性是nonatomic
)。
更重要的是,除非您能够将此额外开销确定为特定情况下的瓶颈,否则您不应该关心它。使用getter有许多优点,你不应该过早地放弃它们只是为了在没有必要的情况下提高性能。
答案 1 :(得分:0)
[ self.foo bar ];
相当于2个方法调用:
temp = [ self foo_Getter ]; // first method call
[ temp bar ]; // second method call
因此,当然会有更多的Objective C运行时方法调度开销。
但是,您可能只会在某些计算绑定例程(数字,音频,图像处理等)的内部循环中发现此开销可测量。因此,在内部循环之外,编写可读的可维护代码。在内部循环内部,根据需要使用临时局部变量,以避免编译器无法优化的任何重复方法调度(除非违反内存管理规则等)。