Iphone _myObject vs self.myObject

Iphone _myObject vs self.myObject,iphone,ios,objective-c,macos,Iphone,Ios,Objective C,Macos,前几天晚上,当我在做一个游戏时,我意识到我可以通过使用\u myObject而不是self.myObject来减少方法调用的数量,从而提高“tick”代码的性能 假设myObject是一个属性,由编译器隐式合成,并且已经有了一个值,那么最下面的一个会做与最上面的一个相同的事情吗 // Non-ARC self.myObject = [self someValue]; _myObject = [self someValue]; 答案取决于属性的声明:例如,如果myObject声明为copy,则这

前几天晚上,当我在做一个游戏时,我意识到我可以通过使用
\u myObject
而不是
self.myObject
来减少方法调用的数量,从而提高“tick”代码的性能

假设
myObject
是一个属性,由编译器隐式合成,并且已经有了一个值,那么最下面的一个会做与最上面的一个相同的事情吗

// Non-ARC
self.myObject = [self someValue];
_myObject = [self someValue];

答案取决于属性的声明:例如,如果
myObject
声明为
copy
,则这两个操作非常不同:通过属性赋值将生成一个副本,而直接赋值给变量将不会复制。但是,如果属性是
assign
非原子的
,它们执行的操作将是相同的

//for @property (noatomic, retain) NSString* myObject, the setter generated by compiler after synthesize will be like this:
- (void) setMyObject: (NSString*) newObj
{
    NSString* temp = [newObj retain];
    [_myObject release];
    _myObject = temp;
}

//for @property (noatomic, copy) NSString* myObject, setter will be like this:
- (void) setMyObject: (NSString*) newObj
{
    NSString* temp = [newObj copy];
    [_myObject release];
    _myObject = temp;
}

//for @propert (noatomic, assign) NSString* myObject, setter will be like this:
- (void) setMyObject : (NSString*) newObj
{
    _myObj = newObj;
}

希望这能有所帮助。

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

当您执行类似于
self.myObject=x
的操作时,这通常相当于
[self-setMyObject:x]
形式的方法调用(尽管如果在属性声明中重写,实际的setter方法名称可能是其他名称)

retain
copy
属性的情况下,该方法显然比简单赋值要复杂得多。但即使在
赋值
属性的情况下,也存在重大差异

当您有一个方法调用时,总是有可能在代码中的其他地方重写该方法。在直接赋值的情况下,它始终是一个赋值而不是其他赋值

通过方法调用,您可以自动获得对的支持。使用直接分配时,不会生成KVO通知


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

原子性之类的东西也会产生影响,但在95%的情况下,它不会产生影响。@RichardJ.RossIII原子性的优点,谢谢!我就是这么想的。因此,为了获得最佳性能,我应该通过
\u myObject
访问
myObject
(例如,调用对象上的方法),但我应该使用
self.myObject
来设置值?如果性能是您最关心的问题,那么是的。请记住,为了获得性能提升,您正在失去一定数量的可扩展性和信息隐藏。作为后续工作,我需要为音乐应用程序编写一些高性能代码,最终我确实直接访问了对象