我是 IOS 开发的新手,我已经开始学习 Objective c 以针对 IOS 7 进行编程。据我所知,由于自动引用计数,现在编码比以前容易得多。
有几件事我不明白。在 MAIN 方法中,我们有 autoreleasepool 块,所以我的第一个问题是,为了启用 ARC ,代码必须在这个块内?如果不是,那么 autoreleasepool 中的代码和其他不是的代码之间有什么区别?
我的第二个问题是,当我编写 IPHONE 程序时,我有一堆类,这些代码中没有一个在“autoreleasepool”中,只有 MAIN 方法中的代码。
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([HomepwnerAppDelegate class]));
}
}
那么,这是否意味着该块以某种方式神奇地应用于同一程序的任何其他类中的所有代码行?
我的最后一个问题是,无论有没有 ARC,如果我们在方法中声明了一个指针变量,当方法返回/退出时,对象是否会被释放/销毁?
假设我们有一个这样的方法:
- (void)doSomething {
NSMutableArray *allItems = [[NSMutableArray alloc] init];
NSString *myString = @"sample string";
[allItems addObject:myString]
}
那么当我们调用这个方法并且它退出时,方法内部定义的那些局部变量会发生什么?如果我们使用 ARC,结果有什么不同吗? (对象是否仍在内存中)
最佳答案
自动释放池比 ARC 早了大约 15 年。 Cocoa 使用引用计数内存管理方案,其中(至少在概念上)对象创建时引用计数为 1,retain
将其增加 1,release
将计数减少 1,当计数达到时对象被销毁0.
这个方案的一个问题是它使得返回一个对象有点尴尬,因为你不能在返回之前释放它——如果你这样做了,它可能会在其他方法使用它之前被销毁——但你不会也不想要求其他方法释放对象。这就是自动释放池的用武之地。自动释放池允许您将对象交给它,并 promise 稍后为您释放该对象。在手动保留/释放(我们在 ARC 之前用来做事的方式)下,您通过将 autorelease
发送到对象来完成此操作。
好的,那么 ARC 就出现了。 ARC 真正改变的唯一一件事是您不再是编写 retain
、 release
和 autorelease
的人——编译器会为您插入它们。但是你仍然需要一个自动释放池来让自动释放的对象进入。
至于你的第二个问题:
如果您使用 ARC,编译器将释放局部变量引用的任何对象。如果您不使用 ARC,则需要自己编写 [allItems release]
,因为超出范围的变量不会神奇地导致它引用的对象被释放。
关于ios - 关于 ARC , AutoRelease 的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20573157/