gpt4 book ai didi

ios - 在创建对象后自动释放对象时出错

转载 作者:行者123 更新时间:2023-12-01 18:32:24 24 4
gpt4 key购买 nike

我开始研究 IOS 开发,我对释放没有存储引用的对象有一些疑问。我看了一下“释放没有指针的对象?”这个问题。建议在创建对象后立即将自动释放消息发送到对象,因此我尝试在以下代码中执行相同操作:

int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data;

data = [NSURLConnection
sendSynchronousRequest: [[NSURLRequest requestWithURL:
[[NSURL URLWithString: @"http://www.google.it"]
autorelease]
] autorelease]
returningResponse: &response
error: &error];

[data writeToFile: @"/tmp/test.html"
atomically:NO];

[data release];
[pool drain];

return 0;
}

我还不能尝试在 XCode 中执行程序,但是我正在 linux 下编译,发送到 NSURLRequest 对象的自动释放消息会导致段错误(我认为这不是由消息本身引起的,而是由尝试的池耗尽引起的释放对象,由于自动释放消息)。我发送给 NSURLRequest 对象的自动释放消息有什么问题?

我认为,如果像 requestWithUrl 这样的类方法的引用文档说它“创建并返回 URL 请求”,这意味着我有责任在使用完对象后释放它,我错了吗?在进一步讨论其他任何事情之前,我想很好地理解这个内存管理规则。我希望我的问题不会太愚蠢;-)

呃,最后一个问题:我应该释放同步请求返回的错误和数据对象吗?

预先感谢您的任何帮助!

最佳答案

+requestWithURL: (和其他)方法已经返回自动释放的对象,因此您不应再向它们发送一个自动释放对象。

代码中的额外自动释放会使对象稍后过度释放并导致应用程序崩溃。

知道是否必须释放对象的经验法则 - 仅当您使用名称中包含“alloc”、“new”、“copy”的方法创建对象时才需要释放。所有标准 API 都遵循此规则,您在开发自己的方法时应遵循此规则。

所以更正的代码将是:

int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data;

data = [NSURLConnection
sendSynchronousRequest: [NSURLRequest requestWithURL:
[NSURL URLWithString: @"http://www.google.it"]
returningResponse: &response
error: &error];

[data writeToFile: @"/tmp/test.html"
atomically:NO];

[pool drain];

return 0;
}

附言由于上述原因,不应释放数据和错误对象。

关于ios - 在创建对象后自动释放对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7282213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com