我正在学习 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/