2012-02-17 75 views
0

我有一个实例变量声明为保留属性&然后我释放它2次。释放后我不使用它。这不会导致任何崩溃。有没有释放变量超过所需的(假设变量是不会释放后使用)任何其他影响:释放一个变量的影响,然后保留计数

@property (nonatomic, retain) NSString *myVariable; 
self.myVariable = nil; 
self.myVariable = nil; 
+1

您似乎对对象和变量之间的差异感到困惑。如果变量为零,则变量可以释放无数次。而任何时候只释放一个非零对象都会导致崩溃。 – hotpaw2 2012-02-17 01:20:22

+0

我认为你是对的。你可以把这个作为答案,以便我可以将其标记为接受。 – Abhinav 2012-02-17 01:42:15

回答

1

您可能会对变量和对象之间的区别感到困惑。一个变量可以与释放无限次地一起使用(比如,如果是零,或者它在每次释放前拥有一个完全不同的保留对象,等等。这是因为一个变量不能容纳对象,或者不同的对象在不同的​​位置次)。在你的例子中,变量在第二次发布期间不包含对象(nil)。

但是释放任何一个非零对象只是一次太多可能是导致崩溃的原因。

4

你是不是,其实,释放它的两倍。这是因为你正在使用属性。你第一次打电话给self.myVariable = nil,你会发布它(假设它有价值)。但第二次,它已经没有,所以没有什么可发布的。

一般来说,实际上多次释放对象(或者更确切地说,释放的次数多于保留次数)非常糟糕,几乎肯定会导致应用程序崩溃。

2

你实际上并没有释放它两次。鉴于制定者看起来是这样的:

- (void)setMyVariable:(NSString)value 
{ 
    [myVariable release]; 
    myVariable = [value retain]; 
} 

第一self.myVariable = nil将释放myVariable伊娃,同时也将其设置为零。接下来的self.myVariable = nil什么都不会做,因为[nil release]什么都不做。

实际上,过度释放对象会(通常)导致崩溃。

0

代码中不会发生任何事情。我假设你正在使用ARC(自动引用计数),所以你通过将它的指针设置为零来“释放”它。

它是如何工作的,假设你有一个NSString对象分配在内存中,你创建它并为它指定一个指针。

所以现在你的指针指向那个对象,这个弧是什么:如果一个对象不再有指向它的指针,它会自动释放。假设你只有那个NSString上的“myvariable”指针,那么它将在你设置为零的那一刻被释放。

如果您将myvariable重新设置为零,那么您完全没有做任何事情,因为该对象之前已经发布。

请注意,这意味着如果你有另一个指向该NSString的变量,那么对象WONT将被释放,但myvariable不会再指向它。

我忘了提及,你可以找到关于弧如何在Ray Wenderlich的“iOS 5 by tutorials”中工作的极好解释。

PD:如果您正在使用ARCü应该改变你的

@属性(非原子,保留)的NSString * MYVARIABLE;

@属性(非原子,强)的NSString * MYVARIABLE;

0

随着iOS 5中新的ARC(自动引用计数),你不应该担心这个问题,因为编译器负责这个。

了解更多关于在这里:​​ http://clang.llvm.org/docs/AutomaticReferenceCounting.html

但是,如果你不能/不想使用ARC,这是我的备选答案:

通过访问瓦尔你的方式(self.var = nil),我的猜测是,这些综合功能照顾不释放非保留变种,所以你可以安全地做到这一点,尽可能多的你喜欢(虽然不是很优雅)。

另一方面,如果您明确地要求释放像这样的[var release]两次或更多版本,您可能会遇到非常讨厌的问题。

相关问题