我是iPhone开发的新手,在进入我的第一个应用程序之前,我做了很多阅读。所有这些阅读让我明白正确的内存管理是一个大问题,所以我想做正确的事情。
我刚刚完成了我的第一个应用程序,并开始测试它是否泄漏。有很多:) 我已经更改了代码以解决泄漏问题,然后开始获取BAD_ACCESS异常。现在问我的问题:
我有一个UITextView对象,我们称之为'utv'。我看到它的'text'字段定义如下:
@property(非原子,复制)NSString * text;
如果我写下以下代码行:
utv.text = [NSString stringWithString:@"Blabla"];
我不应该担心自动释放池释放字符串,对吧?因为它使用副本?
如果将其定义为
,该怎么办?@property(nonatomic,retain)NSString * text;
我是否仍然不关心自动释放池,因为保留将引用次数提高了1?
我可以知道autorealease池何时会释放我用stringWithString而不是initWithString创建的字符串?
谢谢! 利
答案 0 :(得分:3)
在我看来,你已经回答了自己的问题。如果该属性为retain
,则新值将在其合成的setter方法中发送retain
消息,因此您不必担心:)
以下是setter之间的代码差异,以帮助您了解它们如何处理内存:
// assign
property = newValue;
// retain
if (property != newValue) {
[property release];
property = [newValue retain];
}
// copy
if (property != newValue) {
[property release];
property = [newValue copy];
}
答案 1 :(得分:1)
不要考虑自动释放池或保留计数的内存管理。根据您是否拥有某个对象来考虑它。如果你拥有它,你有责任释放它。
这两行都创建了保留属性:
@property (nonatomic, copy) NSString *text;
@property (nonatomic, retain) NSString *otherText;
副本只是意味着保留副本,而不是原件。这两个属性都是内存管理的,因此您不必担心正常使用中的保留或释放。
self.text = string1; // this retains a copy of string1
self.text = string2 // this releases the copy of string1 and retains the copy of string2
self.text = nil; // this releases the copy of string2
你拥有self.text和self.otherText,所以你需要在dealloc中释放它们。
如果您不分配,新建,复制或保留对象,则不拥有该对象。如果您不拥有它,但是您需要保证它在运行循环结束后保持不变,请保留所有权。
答案 2 :(得分:0)
你是对的。当属性设置为保留或复制时,您不应该关心自动释放池。您不会知道NSAutoreleasePool
何时会释放您的字符串,但您可以安全地假设您可以在自由声明的相同方法中使用它。每个线程都应该有自己的NSAutoReleasePool
,它可以在任何时候排空,但通常在每个运行循环开始时耗尽。
答案 3 :(得分:0)
您保留的任何内容,都需要发布。你不能依赖autorelease什么时候会释放池中的什么。
之前已经问过这个问题。这是简单的答案
答案 4 :(得分:0)
This对于内存管理来说是一个很好的读物 希望这有助于某人。!