我是 iPhone 开发的新手,在理解内存管理方面遇到了障碍。我已经阅读了 Memory Management Guide for Cocoa并且已经阅读了很多关于 SO 的问题和答案,但还没有找到完整的答案。
如果我有一个创建对象的实例方法,我看到的每个示例似乎都使用自动释放调用:
-(NSArray *)findThings {
NSArray* things = [[[NSArray alloc] init] autorelease];
// add some lovely things to my shiny new array
return things;
}
忘记人为的例子,我读到的关于 iPhone 开发最佳实践的所有内容都说不鼓励使用自动释放池,但是如果没有自动释放池我怎么能实现上面的例子呢?如果这个方法被调用很多很多次,感觉就像我冒着用“东西”堵塞 iPhone 的自动释放池的风险,这似乎违背了在这样一个受限平台上将资源使用保持在最低限度的需要.
我考虑了以下几点:
-(NSArray *)findThings {
NSArray* things = [[NSArray alloc] init];
// add some lovely things to my shiny new array
[things release];
return things;
}
但是“things”在传递给调用方法之前的保留计数为零,所以我觉得在调用 [things release] 和调用 findThings 的方法之间对象被释放的风险很大实际使用结果。
内存管理指南中的规则让我有点困惑,它指出:
A received object is normally guaranteed to remain valid within the method it was received in. (...) That method may also safely return the object to its invoker.
我不确定这是否意味着作为实例方法的编写者我可以安全地执行释放而没有对象被释放的风险,直到调用方法的范围结束,或者是否作为提供的框架中的类的用户通过 apple 我可以假设我不必担心我从这些类接收到的对象的保留/释放/等,只要该方法的名称中没有 new/init/alloc/copy/whatever。
总结一下,
- 我可以在返回对象之前使用 release 而不是 autorelease 以避免在 iPhone 上使用自动释放池吗?
- 如果没有,是否有更好的不涉及自动释放池的模式?
- 我是否遗漏了一些基本的东西?文档中似乎有一个漏洞。
提前致谢
最佳答案
Forgetting the contrived example, everything I've read about iPhone dev best practices says that autorelease pools are discouraged
不鼓励使用自动释放池;它们在 Cocoa 中无处不在,如果使用得当,它们对内存使用的影响零。自动释放池仅在它们人为地延长大量对象的生命周期时才值得关注,例如在循环中,在这种情况下,您将手动管理自动释放池。
关于iphone - 你如何在没有自动释放的情况下管理释放在 iPhone 上的实例方法中创建的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2242281/