Время выпуска и распределения объекта - PullRequest
0 голосов
/ 11 июня 2010

Код этого вопроса слишком длинный, чтобы его можно было использовать. Но я почти уверен, что моя проблема связана с выпуском класса.

У меня есть вспомогательный класс ConnectionHelper.h / .m, который обрабатывает NSURLConnection для меня. По сути, я даю ему URL-адрес, который мне нужен, и он возвращает данные (он также выполняет быстрый анализ json). У него есть делегат, который я установил для вызывающего класса (в данном случае: DownloadViewController). Когда он заканчивает загрузку, он вызывает [delegate didFinishParseOf:objectName withDictionary:dictionary];. Затем в DownloadViewController я выпускаю ConnectionHelper и выделяю новый для загрузки следующего объекта.

Моя проблема в том, что я делаю это один раз, а затем он создает соединение для второго, а затем моя программа просто падает. После этого звонка:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];  
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

Тогда я не думаю, что какой-либо из следующих методов вызывается:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection 
              willCacheResponse:(NSCachedURLResponse *)cachedResponse

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

Так я прав в том, что я что-то не выпускаю? Когда я выпускаю его в первый раз, функция dealloc не вызывается. Есть ли способ, которым я могу «заставить» его освободить? Нужно ли заставлять это? Я не думал, что это будет иметь значение, так как я выделил новый ConnectionHelper для нового вызова. Как еще они могут перекрываться / конфликтовать друг с другом?

Спасибо.

1 Ответ

0 голосов
/ 11 июня 2010

Прежде всего, вам никогда не придется принудительно освобождать. Если вы будете строго следовать правилам управления памятью, вам даже не придется об этом беспокоиться. Правила смотрите на:

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW1

Если ваше приложение дает сбой, мне кажется, что что-то выходит рано. Вероятно, объект, который вы устанавливаете в качестве делегата для вашего соединения. И последнее, но не менее важное: вы обращались к ASIHTTPRequest для обработки соединений? Это оболочка CFNetwork, очень простая в использовании и очень мощная.

Надеется, это поможет.

...