目标C - 内存管理问题?

时间:2010-09-16 01:01:36

标签: objective-c memory-management

我知道当我拥有一个设置为保留或复制的对象的属性时,我必须执行以下操作。

Object *o = [[Object alloc] init];
self.myObject = o;
[o release];

但如果我没有为myObject定义属性怎么办?

我可以在没有泄漏的情况下执行以下操作吗?

为每个类中的每个变量定义属性是否更好?的为什么 ...

myObject = [[Object alloc] init];

4 个答案:

答案 0 :(得分:2)

是的,您可以设置一个实例变量并且它完全没问题 - 实际上,这是在init方法中执行此操作的首选方法(因为setter可能有副作用)。只需记住在设置新对象之前释放变量中的旧对象(如果有),否则您将泄漏。无论您是使用属性还是直接设置ivar,都需要在dealloc中释放对象。

答案 1 :(得分:1)

您可以做的是确保在将保存它的变量分配给新实例(无论是另一个对象的保留版本还是其副本)之前释放先前分配的对象。

如果没有为其定义属性,请不要使用点语法。

答案 2 :(得分:1)

因为雅各布已经回答了没有财产的部分。我会回答左边的

  
    

我可以在没有泄漏的情况下执行以下操作吗?

  

myObject = [[Object alloc] init];

你必须在某个地方释放myObject,也许在委托方法中,或者在你完成使用它之后,但是记得释放对象,特别是在丢失对象引用之前

  
    

为每个类中的每个变量定义属性是否更好?为什么?

  

这取决于您的编码约定,定义所有属性将帮助您进行大量内存管理,但它带来负担,有时您的团队不希望为每个变量定义实例变量,属性和合成,这意味着相当很多代码。所以,与你的团队讨论,看看你的弱点和力量是什么。如果你在内存管理上很弱,我建议为每个

定义

答案 3 :(得分:1)

您不需要拥有任何属性。 Obj-C直到几年前才用它们用Obj-C 2.属性很方便 - 它们为你提供了一些内存管理而无需你编写样板代码(访问方法是为你合成的),以及你可以使用点符号,有些人比通常的Obj-C语法更熟悉。

虽然说过属性会为你处理内存管理,但这只是部分正确。您仍然需要在dealloc方法中将所有属性设置为nil。所以这真的不会给你带来太大的影响,因为没有属性你仍然需要在dealloc中释放每个对象。

最大的好处是,在将对象从一个地方分配到另一个地方时,属性会为您处理引用计数。您不必手动编写getter和setter。出于这个原因,我喜欢属性。此外,clang正在获得具有属性的能力,您只需要@property行,不需要后备变量,也不需要@synthesize行。单行属性是我书中的一个胜利。 (好的,两行,你需要在dealloc中添加一行:)