我已经在iPhone上编程有一段时间了,对内存管理的经验不是很好。我想知道以下方法是否是释放内存的好方法。
int count = [someObject retainCount];
for (int i = 0; i < count; i ++)
{
[someObject release];
}
在某些情况下(特别是在UIWebViews
中),这种方法是一种绝望的举措。变量的保留计数被减少到零,这将释放它正在使用的内存。这个方法有点不太干净,但是它是否存在任何瓶颈?
我已经在iPhone上编程有一段时间了,对内存管理的经验不是很好。我想知道以下方法是否是释放内存的好方法。
int count = [someObject retainCount];
for (int i = 0; i < count; i ++)
{
[someObject release];
}
在某些情况下(特别是在UIWebViews
中),这种方法是一种绝望的举措。变量的保留计数被减少到零,这将释放它正在使用的内存。这个方法有点不太干净,但是它是否存在任何瓶颈?
retainCount
,因为iOS
框架可能会保留对象。retainCount
的声明:
要了解您必须遵守的内存管理基本规则,请阅读“内存管理规则”。为了诊断内存管理问题,请使用适当的工具。重要提示:此方法通常无法帮助您调试内存管理问题。因为任何数量的框架对象都可能保留了一个对象以持有对它的引用,同时自动释放池可能会持有任意数量的延迟释放对象,因此您很难从此方法中获得有用的信息。
-retainCount
几乎没有用。当你刚接触 Objective-C 的内存管理/引用计数时,有时会尝试使用 -retainCount
来帮助理解引用计数的工作原理,但实际上,这可能会在最好的情况下让人感到困惑。someObject
的周围环境。当应用于其他意外情况时,它也可能是危险的。以使用 @"a string"
编译指令创建的常量 NSString
为例:这些字符串被创建并设计永不释放。因此,像以下示例中那样应用你的代码将导致无限循环:int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *string = @"theString";
NSLog(@"retainCount == %lu", (unsigned long)[string retainCount]);
for (NSUInteger i = 0; i < [string retainCount]; i++) {
[string release];
}
[pool drain];
return 0;
}
2011-06-30 08:40:16.287 retainCount[35505:a0f] retainCount == 1152921504606846975
[[NSNumber alloc] initWithInt: 3];
进行相同的练习,然后定义“常量”的含义... - bbum// Create an autoreleased object
MyObject *myObject = [[[MyObject alloc] init] autorelease];
// Run your code to make it dealloc itself
int count = [myObject retainCount];
for (int i = 0; i < count; i ++)
[myObject release];
你的代码将强制使myObject
被释放。
然而,myObject
也已经被放入自动释放池中-一旦该池开始释放其对象,你的应用程序将崩溃,因为myObject
不再存在!
规则很简单:每次使用init、new或copy时都要调用release。否则,这不是你的问题。
+stringWithString: /*an instance of NSConstantString*/
将只返回常量字符串,因此您实际上正在尝试释放静态对象。正如我所说,重要的是它是错误的:尝试聪明地处理它的错误只会以泪水收场。 - user23743不应该依赖于retainCount的值。您应该尽可能频繁地释放alloc
和copy
。
编辑:还有new
和retain
。