Вопрос делегата АРК - PullRequest
       2

Вопрос делегата АРК

0 голосов
/ 31 марта 2012

Мне нужно скачать несколько изображений с сервера. Поэтому я создал отдельный класс для обработки делегатов NSURLConnection. В конце didFinishDownloadingData я вызвал метод делегата, такой как [(id)delegate performSelectorselector(finished:) withObject:receivedData] У меня есть контроллер вида под названием ListImages. Я создал вышеупомянутый класс соединения из класса ListImages и назначил connection.delegate = self. После загрузки изображения с сервера метод -(void)didFinishDownloadingData:(NSData *)data; был успешно вызван, и я смог отобразить это изображение.

Моя проблема начинается сейчас. Для решения некоторых общих задач я создал новый класс с именем SharedMethods, который является подклассом NSObject. Я выделил класс соединения как

  Connection *conn = [[Connection alloc]init];

  conn.delegate  = self;
  [conn startDownload];  //called a method which starts nsurlconnection.

Я использую ARC, поэтому не выпустил этот объект. Мое приложение получило исключение в методе (в классе подключения)

  - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        [(id)delegate performSelectorselector(finished:) withObject:receivedData]; //Got an exception in this line

   }

Исключение составляло [SharedMethods retain] message send to deallocated object. Я не думаю, что я выпустил что-нибудь, потому что я использую ARC.

Также возникла проблема при вызове UIAlerView делегатов внутри класса, который является подклассом NSobject. Это не называется каким-либо образом. Я сомневаюсь, есть ли проблемы с использованием NSObject подкласса? Есть ли что-то, что следует учитывать при использовании подкласса NSObject? Заранее спасибо.

1 Ответ

2 голосов
/ 31 марта 2012

Использование ARC не означает, что объекты никогда не получат метод release или что они никогда не будут освобождены.Это просто означает, что вам не нужно делать явные вызовы retain и release, и это происходит автоматически.

Проблема в том, что ваши объекты освобождаются, потому чтоникто не владеет ими.Ваша конкретная проблема заключается в том, что SharedMethods освобождается, потому что он не сохраняется, но я не могу показать вам, как именно это происходит, потому что вы не опубликовали соответствующий код.

Однако я могу показатьвы, что вы не управляете своим Connection должным образом, и, надеюсь, это поможет вам понять, что вы делаете неправильно с SharedMethods.

Таким образом, вы создаете Connection с помощью alloc init, чтос кодом retain-release это даст счет сохранения 1, но так как вы больше не используете ARC, это не очень важно.Если какой-либо другой объект не подтвердит владение Connection, ARC автоматически вставит вызов на release, чтобы вернуть счетчик удержания обратно в 0 (это похоже на то, как если бы ARC автоматически вставил autorelease).

Поскольку вы не присваиваете Connection свойству strong или retain и не помещаете его в коллекцию, никакой другой объект не претендует на владение им.Поэтому, как только выполнение достигнет конца области действия, в которой определена переменная conn, оно будет освобождено и освобождено.

Таким образом, в ARC, как и в коде ручного сохранения и выпуска, вам все равно необходимоубедитесь, что объекты принадлежат какому-то другому объекту, чтобы они оставались рядом.Единственное отличие состоит в том, что вам не нужно вручную вызывать retain и release, вам просто нужно подумать о графе владения объектом - какому объекту принадлежит другой объект - и убедиться, что любой объект вы хотитеПалка вокруг принадлежит другому объекту.

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

...