【发布时间】:2014-12-26 00:26:05
【问题描述】:
我正在使用 Big Nerd Ranch 指南来开始使用 Objective C。我对第 20 章中谈到的项目有一个问题。在较高的层次上,该项目执行以下操作
创建 3 个类 Person、Employee(从 person 继承)和 Assets(Employee 有一个指向 Assets 对象的实例变量)
-
然后它会创建 2 个 NSMUtableARrays
- 数组 1:employees:Employee 对象数组(一些指向 0 资产对象,一些指向 1,一些指向 2 个资产对象)
- Array 2: allAssets: Array os Asset 对象(每个创建的 Asset 对象一个条目)
随后,employees 数组中的一个对象被释放。这会导致此 Employee 对象被释放,但链接到 Employee 对象的资产对象并没有,因为 allAssets 数组拥有它
之后,我在 main 中的 return 0 之前放置了一个 sleep (60)
我看到如果 sleep(60) 在 @autoreleasepool{} 之后,那么所有对象都会在 1 分钟的睡眠发生之前被释放
但是如果 sleep(60) 发生在右大括号之前,那么所有对象都会在 1 分钟的 sleep 发生后被解除分配
为什么会这样?我认为只有在返回发生后自动释放才会启动?为什么在我将睡眠放在@autorelease{}之外的情况下它会在返回之前发生,它只是一个编译器优化,它认识到此时不再需要对象,因为剩下的唯一一行是sleep()?
我已将项目上传到
【问题讨论】:
标签: objective-c memory-management autorelease