iphone - 理解ios中的内存管理

标签 iphone objective-c ios memory-management dealloc

我正在学习 objective-c 和编写 iPad 应用程序。我不断绊倒自己并不得不重新阅读的一件事是内存管理。我正在到达那里......慢慢地。基本规则(例如对于每个 alloc/retain 必须有一个 release)很有用。然而,一件相对基本的事情让我难以理解,我想知道是否有人可以解释......

采用以下代码...

NSArray *myArray = [[NSArray alloc] init];
myArray = [someNSSet allObjects];

这是相对直接的编码,需要一个 [myArray release] 语句。

但是,我不断看到这样的例子(事实上,我已经广泛使用了以下“捷径”...

NSArray *myArray = (NSArray *)[someNSSet allObjects];

据我所知,当您使用 (NSString *) 时,您不需要使用 [myArray release] 语句,但我不明白为什么。

谁能解释一下?

最佳答案

NSArray *myArray = [[NSArray alloc] init];
myArray = [someNSSet allObjects];

此代码正在泄漏 myArray,因为您丢失了对在第一行分配的 NSArray 的引用;你不需要在这里 alloc,因为在第二行你要为 myArray 分配一个新值。

NSArray *myArray = (NSArray *)[someNSSet allObjects];

这个代码示例非常好,您将 [someNSSet allObjects] 的结果分配给 myArray 指针并且您不拥有返回值,所以你不需要关心释放它。

考虑为您的项目使用 ARC(自动保留计数)。使用 ARC,编译器会处理保留计数,因此您不必,实际上是不允许的。有一个重构将转换当前项目。

关于iphone - 理解ios中的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9455797/

相关文章:

iOS和libxml编译警告问题

ios - requestalwaysauthorization() 突然消失

ios - 以编程方式添加了 UIDatePicker ...我该如何移动它?

iphone - iPhone 应用程序的本地存储

iphone - UITableView 查找部分标题的位置?

iphone - 如何在 iOS 中使用 ASI Http 将数据发布到 Web 服务?

objective-c - 'atomic' 和非原子有什么区别?

iphone - 将 managedObjectContext(核心数据)传递给其他类,正确完成了吗?

ios - 从现有应用程序中排除 iPad 支持

ios - 用于视网膜显示屏的所有 iDevices 的图像后缀