gpt4 book ai didi

ios - 关于 ARC , AutoRelease 的困惑

转载 作者:可可西里 更新时间:2023-11-01 06:24:42 25 4
gpt4 key购买 nike

我是 IOS 开发的新手,我已经开始学习 objective-c 以针对 IOS 7 进行编程。据我所知,由于自动引用计数,现在编码比以前容易得多。有几件事我不明白。在 MAIN 方法中我们有 autoreleasepool block ,所以我的第一个问题是为了启用 ARC ,代码必须在这个 block 内?如果不是,那么 autoreleasepool 内部的代码与其他不在内部的代码有什么区别?

我的第二个问题是,当我编写我的 IPHONE 程序时,我有一堆类并且这些代码中没有一个在“autoreleasepool”中,只有 MAIN 方法中的代码。

 int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([HomepwnerAppDelegate class]));
}
}

那么,这是否意味着这个 block 以某种方式神奇地应用于同一程序的任何其他类中的所有代码行?

我的最后一个问题是,无论是否使用 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 唯一真正改变的是你不再是编写 retainreleaseautorelease 的人——编译器将它们插入你。但是你仍然需要一个自动释放池来让自动释放的对象进入。

关于你的第二个问题:

My last question is that whether with ARC or without it, if we had a declared pointer variable inside a method, does the object gets released/destroyed when the method returns/exit?

assume we have a method like this :

- (void)doSomething {
NSMutableArray *allItems = [[NSMutableArray alloc] init];
NSString *myString = @"sample string";
[allItems addObject:myString]
}

then when we call this method and it exits, what would happen to those local variables defined inside the method ? is there any difference in the outcome if we are using ARC or not ?

如果您使用的是 ARC,编译器将释放局部变量引用的所有对象。如果您不使用 ARC,您需要自己编写 [allItems release],因为超出范围的变量不会神奇地导致它引用的对象被释放。

关于ios - 关于 ARC , AutoRelease 的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20573157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com