如果我有这个代码
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文档说这是错误的.
一般的经验法则,如果你正在调用辅助静态方法(如stringByAppendingString),那么就不应该释放它.在给予您之前,该字符串已添加到自动释放池中.如果您呼叫alloc随后的init...方法,那么你是负责释放该对象.
您的代码中需要注意的其他事项:
stringByAppendingString,即内存泄漏.[postData release]和[request release]postData和之间有任何关联request,所以不确定你对他们两个的确切了解.