_myObject vs self.myObject

Nat*_*mer 0 iphone macos objective-c ios

当我在另一个晚上处理游戏时,我意识到我可以通过使用_myObject而不是减少方法调用的数量来提高我的"tick"代码的性能self.myObject.

假设这myObject是一个属性,由编译器隐式合成,并且已经有一个值,那么底层的那个与顶层的那个做同样的事情吗?

// Non-ARC
self.myObject = [self someValue];
_myObject = [self someValue];
Run Code Online (Sandbox Code Playgroud)

Jam*_*ess 5

这两条线根本不同.前者本质上是对属性的setter方法的方法调用,而后者是直接成员赋值.

当你做类似的事情时self.myObject = x,这通常相当于表单的方法调用[self setMyObject:x](尽管如果在属性声明中重写,实际的setter方法名称可能是其他的).

在a retaincopyproperty 的情况下,该方法显然比简单的赋值更多.但即使在assign房产的情况下,也存在重大差异.

当您进行方法调用时,总是有可能在代码中的其他地方覆盖该方法.在直接赋值的情况下,它总是一个赋值而不是其他任何东西.

通过方法调用,您可以自动获得Key-Value Observing的支持.通过直接分配,不会生成任何KVO通知.

最后,正如您所注意到的,直接成员分配和对setter方法的调用之间显然存在显着的性能差异.