Apple NSURLConnection文档错了吗?

时间:2010-08-20 22:11:57

标签: iphone objective-c cocoa-touch memory nsurlconnection

// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
                        cachePolicy:NSURLRequestUseProtocolCachePolicy
                    timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    receivedData = [[NSMutableData data] retain];
} else {
    // Inform the user that the connection failed.
}

既然我们没有“拥有”通过调用retain来接收数据,那么我们不是在泄漏内存吗?

你应该什么时候发布连接并收到数据呢?

2 个答案:

答案 0 :(得分:1)

1 /关于连接,我们使用委托模式来处理这个内存管理。您分配init并在一个方法中设置委托。然后当你喜欢连接回调时:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
  [connection release];
}

或者您可以在任何其他委托方法中释放连接。这是他们将连接传回给你的原因之一。你将在iPhone中像UIImagePickerController一样很多地遇到这种委托模式(仅用于另一个例子),特别是当你必须等到网络完成发布时的网络问题

2 /来自评论,

// Create the NSMutableData to hold the received data.
// receivedData is an instance variable declared elsewhere.

因此,这很容易回答,因为receivedData是一个实例变量,您应该并且可以在dealloc方法中释放它。另一个选择是为它声明一个@property (nonatomic, retain),如果多次设置receivedData,它将确保没有内存泄漏

答案 1 :(得分:0)

此代码拥有连接和数据。连接是使用alloc / init创建的,需要稍后发布,并且数据会被保留,因此也需要发布。