ARC支持myiVar = nil吗?

时间:2011-12-13 10:52:46

标签: objective-c automatic-ref-counting

我正在使用像

这样的代码段
if ([Array count] != 0) {
    Array = nil;
}
Array = [[NSMutableArray alloc]init];

使用ARC时是否允许这样做?这会导致任何类型的崩溃吗?为什么我这样做是每次调用我的方法时Array获取一组新数据。我在班上很多地方都使用这种片段。

3 个答案:

答案 0 :(得分:10)

除了ARC之外,这次行动毫无意义。您将ivar分配给nil,然后立即分配给其他人。这与将其分配给其他东西没有什么不同。

在ARC之前,如果变量具有先前值,则会给您内存泄漏(无论是否分配给nil)。使用ARC,没有泄漏。

答案 1 :(得分:3)

最佳解决方案:自己测试和看看!这是一个非常简短的例子!

但是,这当然有效! ARC表示自动引用计数。它只是说你不必关心releaseretain等等。

如果你想让一个对象为nil,你仍然可以,因为这是一个简单的指针赋值!

关于你的代码,在重新分配之前你将Array设置为nil!

尝试获取代码的逻辑:

  

如果我的数组有对象

Then Array point to a new nil object

但在所有情况下你都这样做:

  

My Array指向一个新的NSMutableArray对象

因此,无论您的条件是否被评估为真,您的代码都是无用的,因为变量将在之后获取另一个值!

答案 2 :(得分:0)

您展示的示例代码有效。以下是一些变体:

if ([Array count] != 0) {
    Array = [[NSMutableArray alloc] init];
}

示例2:

if ([Array count] != 0) {
    Array = [NSMutableArray array]; //value will be retained
}

示例3:

if ([Array count] != 0) {
    self.Array = [[NSMutableArray alloc] init]; //Will NOT leak under ARC.
}

示例4:

//if ([Array count] != 0) {
[Array removeAllObjects];
//}

所有四个例子在ARC下都有效。

另一件事:实例变量通常首字母小写,但仍然遵循CamelCase方法。另一种方法是在变量名称前加上下划线:如果您没有@synthesize方法来匹配@property值,则会执行此操作。