Документация Apple NSURLConnection является неправильной? - PullRequest
1 голос
/ 21 августа 2010
// 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 ]

1 голос
/ 21 августа 2010

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.

Итак, на это легко ответить, так как полученныйData является переменной экземпляра, вы должны и можете освободить ее в методе dealloc.Другой вариант для вас - объявить @property (nonatomic, retain) для него, и тогда он не будет допускать утечки памяти, если вы установили receiveData несколько раз

0 голосов
/ 21 августа 2010

Этот код владеет как соединением, так и данными.Соединение создается с помощью alloc / init, для которого требуется выпуск позже, а данные сохраняются, поэтому для него также потребуется выпуск.

...