在部署到iOS 4.x时,ARC是否可以安全使用?

use*_*017 2 ios automatic-ref-counting

我们正在开发一个我们想要在iOS 4.3及更高版本上运行的应用程序.

我们的高级开发人员认为使用ARC是一件坏事,并且会导致iOS 5以下的任何事情发生崩溃和问题.这是真的吗?在iOS 4.3上使用ARC时会出现什么问题?

我知道你必须使用unsafe_unretained而不是弱引用.这可能导致什么问题?

如果我们也在为iOS 4.3开发,我们是否应该根本不使用ARC?或者是否可以使用ARC为iOS 5及以上版本和iOS 4.3开发可靠的应用程序?

mat*_*way 6

在部署到4.x时没有理由使用ARC.说完ARC导致iOS 5以下的任何事情崩溃和问题是完全错误的.这完全忽略了这一点而不理解ARC可能是什么.

ARC是编译时的"funkiness".无论如何,这就是我喜欢的名字!它只是添加了正确数量的保留和释放或自动释放,以使您的对象保持在他们应有的长度.我喜欢将其视为将对象转换为堆栈变量.所以请考虑以下代码:

- (void)methodA {
    NSNumber *number = [[NSNumber alloc] initWithInt:5];
    [someObject doSomethingWithANumber:number];
}
Run Code Online (Sandbox Code Playgroud)

ARC将在增加releasenumber,当number变量超出范围.在这种情况下,它methodA返回时超出范围.所以考虑一下这个更精细的代码:

- (void)methodB {
    NSNumber *number = [[NSNumber alloc] initWithInt:5];
    if (<some_expression>) {
        return;
    }
    [someObject doSomethingWithANumber:number];
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果没有ARC,我们将不得不进行2次[number release]调用.一旦提前返回,一次在方法结束时.显然这是一个人为的例子 - 它只是为了展示这个想法.使用ARC,我们不必为它们提供这两个调用.我认为你可以在这看到ARC的强大功能,因为在这种情况下如果你的方法变得更大更复杂,你很容易忘记在从方法过早返回之前释放东西.

回到4.x的问题......你是对的,你不能使用weak引用.这是因为这是ARC中唯一需要运行时帮助的部分,而这不是4.x附带的运行时的一部分.当指向的对象消失时,运行时将自动清零弱引用.因此,如果ObjectA具有对ObjectB的弱引用(例如委托模式),那么如果ObjectB因为不再使用而消失,那么ObjectA的引用将被填充.在我看来,这只是一个安全网.您应该进行编码,以便无论如何都不会发生这种情况.自从弱引用进入以来,你就必须采用这种方式进行编码,这样就不会让它成为一个问题 - 我们多年来一直在做的事情.

在我看来,你应该使用ARC.它会对你有所帮助.您将获得更小的代码和更易读的代码,因为您没有代码中的保留,发布和自动释放.你会因错误的内存管理而减少崩溃和泄漏,这是我们遇到过的问题.

简而言之:使用ARC.