这两段代码之间有什么区别?

时间:2013-11-27 11:37:59

标签: ios objective-c

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

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的一个实例。

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

3 个答案:

答案 0 :(得分: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的直接初始化。

区别仅在于,第一种方式是更多变量进入图像,这也消耗了存储位。即使我们有方便的初始化方法,我们为什么要消耗内存。所以你应该避免第一种方式,采用非常一般和适当的第二种方法。

答案 1 :(得分:1)

如果你在代码中使用ARC,那么这两个语句实际上都是这样做的(发生编译器魔术,确保两个语句最终都有相同的结果)。

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

Code1 :将retain属性与对象分配的理想方式。这将使创建的对象的引用计数保持为1(您的属性将是所有者)。因此,当retain中释放dealloc属性的ivar时,内存将被清除。

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];

Code2 :将对象的引用计数为2(一个来自init,另一个来自retain属性)。即使在dealloc中释放ivar之后,此代码也可能泄漏内存,因为临时对象引用不可用于调用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机制,编译器将插入某些代码行以确保对象的内存不会泄漏(它将创建对象的临时引用,在分配给属性后在此处插入release语句,类似于code1)。

希望有所帮助!

答案 2 :(得分:0)

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