如何在iPhone应用程序中可靠地释放内存?

Gaz*_*zer 4 memory iphone

如果我有这个代码

 NSString *postData = [@"foo=" stringByAppendingString:fooText.text];
 ...
 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
 ...
 [postData release];   //this causes crash
 [request release];    //this causes crash
Run Code Online (Sandbox Code Playgroud)

现在我明白这是Apple的文件预期的行为.现在,如果我删除释放代码,崩溃不会发生,但我发现内存泄漏无论如何为*请求.所以我重写了代码

NSString *postData;
//postData = [NSString alloc];  // this line commented out since OP
postData = [@"foo=" stringByAppendingString:fooText.text];
...
NSMutableURLRequest *request;
request = [NSMutableURLRequest alloc];
request = [request initWithURL:url];
    ...
    [postData release];   //this still crashes #
    [request release];    //this works fine
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么它会在#崩溃.这里有推荐的最佳做法吗?我认为我必须遗漏一些东西,因为我经常看到"速记"方法(顶部)有一个版本(例如Kochan,Objective-C编程),但Apple文档说这是错误的.

Mat*_*eer 7

一般的经验法则,如果你正在调用辅助静态方法(如stringByAppendingString),那么就不应该释放它.在给予您之前,该字符串已添加到自动释放池中.如果您呼叫alloc随后的init...方法,那么你是负责释放该对象.

您的代码中需要注意的其他事项:

  • 在第二个示例中,您分配postData,然后立即将其替换为由其创建的另一个字符串stringByAppendingString,即内存泄漏.
  • 您的发布呼叫是错误的,它们应该是[postData release][request release]
  • 我没有看到你的例子中postData和之间有任何关联request,所以不确定你对他们两个的确切了解.