2013-11-27 130 views
0

所以,我想知道这两段代码之间的区别是什么 - 除了语法差异?这两段代码有什么区别?

BBDataStore* tempDataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 
    self.dataStore = tempDataStore; 

self.dataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 

Self.dataStoreBBDataStore一个属性。

从我所看到的 - 这里没有区别。

在第一个示例中 - 我们最终将tempDataStore分配到self.dataStore - 这是BBDatastore的一个实例。

在第二个例子 - 我们有效地做同样的事情...不是这样吗?

+1

我认为两条线都没有不同。 –

+0

在第一种情况下,第一行创建对象,tempDataStore引用它,当第二行执行时,self.dataStore也指向同一个对象。因此引用计数会增加。当tempDataStore作用域将结束时,将只有一个对象引用,它将是self.dataStore。在第二种情况下,只有一个指向对象的指针,那就是self.datastore –

+1

没有有效的区别。如果使用优化编译器进行编译,则两者可能会生成相同的代码。 (一个调试模式的编译器会有所不同,因为命名变量必须被调试器访问,因此可能不会进行寄存器优化。) –

回答

2
BBDataStore* tempDataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 
self.dataStore = tempDataStore; 

这是将BBDataStore的实例保存到tempDataStore中。而你正在将tempDataStore分配给其他对象,比如self.dataStore。

self.dataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 

这是self.dataStore的直接初始化。

区别仅在于第一种方式多了一个变量进入图片也消耗内存位。为什么我们应该消耗记忆,即使我们有便利的方法来启动。所以你应该避免第一种方式,并采取第二种方法,这是非常一般和适当的。

+0

谢谢 - 这对我很好。我更喜欢第二个。由于我使用ARC - 管理引用计数是为我完成的,没有任何需要担心的问题? (在基本的内存管理方面) – Tander

+1

是的,你不需要担心它。但你应该注意不要为临时任务添加占位符/垃圾变量吗? :)。在所有情况下,都要采取第二种方法。 –

+0

太好了 - 谢谢,我会这么做的! :) – Tander

0

在第一种情况下,第一行创建一个对象并且tempDataStore引用它,当第二行执行时,self.dataStore也指向同一个对象。因此引用计数会增加,两个指针将指向同一个对象。而当tempDataStore范围将结束时,将只有一个对象的引用,那将是self.dataStore。在第二种情况下,只有一个指向对象的指针,那就是self.datastore

1

如果你在你的代码中使用ARC,那么这两个语句的效果都是一样的(编译器会发生奇迹,确保两个语句的结果相同)。

如果有self.dataStore这是手动内存管理声明为retain属性然后,

代码1:将是该retain属性与对象分配理想的方式。这将保持创建的对象的引用计数为1(您的财产将是所有者)。所以当retain财产的伊娃在dealloc被释放时,内存被清除。

BBDataStore* tempDataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 
self.dataStore = tempDataStore; 
//This will ensure memory does not leak, reference count will get reduced by 1 
[tempDataStore release]; 

代码2:将具有所述对象的引用计数为2(一个从init和从retain属性其他)。即使在dealloc中释放伊娃后,由于临时对象引用不可用于调用release方法,因此此代码可能会泄漏内存。

//This created object will have reference count 2 
self.dataStore = [[BBDataStore alloc] initWithDataExpiry:DATA_EXPIRY_TIME]; 
//reference to temporary object is not available hence cannot call release 

因此,在这种情况下,对于ARC机制,编译器会插入某些代码行,以确保您的对象的内存不漏(这将分配后此创建一个临时参考物件,将发布声明属性,类似于code1)。

希望有帮助!