Objective-C内存管理面试题一道

发布于 2022-09-04 08:04:01 字数 264 浏览 12 评论 0

下面关于Objective-C内存管理的描述错误的是
A 当使用ARC来管理内存时,代码中不可以出现autorelease
B autoreleasepool 在 drain 的时候会释放在其中分配的对象
C 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露
D 在使用ARC的项目中不能使用NSZone

= =。。
网上看到的,参考答案为A.

我觉得选C来的~

不知道A错在哪里了?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

站稳脚跟 2022-09-11 08:04:01

C的描述是对的,在遇到需要大量创建对象的地方使用autoreleasepool可以加快对象释放的速度。
如果说A是错的,那只能是说明出题者想考你ARC的原理其实是编译器自动帮你在代码中加入autorelease等代码。其实在ARC的项目中写autorelease连编译都通不过,这样想得话A其实也是对的。
不过既然其他3个都是对的,也只能选A了。

==========更新==========
希望踩我答案的人可以在我这个回答的评论区告诉我什么地方错了。
即使我只大概推测了为什么A不对,但是我明确回答了楼主C是对的。
至于C为什么是对的,可以去看官方文档:autoreleasepool

If you spawn a secondary thread.
You must create your own autorelease pool block as soon as the thread begins executing; otherwise, your application will leak objects. (See Autorelease Pool Blocks and Threads for details.)

==========再次更新==========
上面的文档是关于MRC的,ARC中在线程大量创建对象需不需要autorelease pool可以看这个回答:
http://stackoverflow.com/ques...

却一份温柔 2022-09-11 08:04:01

A 和 D 基本是相同的,但实际上
NSZone *zone = NSDefaultMallocZone();
这句代码是可以编译运行的。

你看的参考答案不对。
ARC 下,不能使用 autorelease 进行编程,但是可以使用 @autoreleasepool。它的作用是降低内存占用。

    @autoreleasepool {
    }

以下内容主要为回复 @ChickenBoy 的“Each thread in a Cocoa application maintains its own stack of autorelease pool blocks.其他线程中是需要自己创建autoreleasepool的,不然不会自动释放,就会产生内存泄漏。”。

Each thread in a Cocoa application maintains its own stack of autorelease pool blocks.
这句话只陈述了一个事实“Cocoa 应用的每一个线程维护了它自己的自动释放池块的栈”
If you are writing a Foundation-only program or if you detach a thread, you need to create your own autorelease pool block.
如果你在编写 Foundation-only 应用 或者 自己 detach 一个线程,你需要创建自己的自动释放池块。

If your application or thread is long-lived and potentially generates a lot of autoreleased objects, you should use autorelease pool blocks (like AppKit and UIKit do on the main thread); otherwise, autoreleased objects accumulate and your memory footprint grows. If your detached thread does not make Cocoa calls, you do not need to use an autorelease pool block.
如果你的应用或者线程长时间存活,并可能产生大量的自动释放的对象;你应该自动自动释放池块;否则,自动释放的对象会积累并占用你的内存。
如果你创建的线程没有调用 Cacoa,你不需要使用自动释放池块。

你的呼吸 2022-09-11 08:04:01

你自己开辟的新的线程,里面的内存就得自己去管理的,只有在主线程的中runloop中才会自动帮你加autoreleasePush()跟autoreleasePop().

生生不灭 2022-09-11 08:04:01

因为ARC是编译器特性,而不是iOS运行时特性,更不是其他语言中的垃圾收集器。
所以这就意味这它只能处理在编译时就确定的内存管理,所用的机制就是引用计数。
换句话来讲,他的内存释放不是强制的,比如内存相互引用,动态引用等会导致引用计数不会立刻置0,所以这个时候显式释放是有必要的。

泛泛之交 2022-09-11 08:04:01

A的错误在于在使用ARC时,编译器会禁止你使用autorelease,而由编译器帮你添加,就像retain,release一样。但是你可以使用__autoreleasing来指定变量,使它加入autoreleasepool

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文