Объект выходит из области видимости, но делегат установлен с использованием ARC - PullRequest
1 голос
/ 12 января 2012

Мне очень жаль неясное название, но я не могу объяснить это в ближайшее время.

Мне просто интересно, что произойдет, если вы используете ARC и у вас есть такой метод:

- (void)fooMethod:(NSURLRequest *)fooReq
{
    NSURLConnection *fooConn = [NSURLConnection connectionWithRequest:fooReq delegate:self];
    [fooConn start];
}

То есть fooConn выходит из области видимости в конце fooMethod, но я все равно получу обратные вызовы? Другими словами: из-за того, что ссылок больше нет, получит ли он немедленно (или что-то в этом роде), или он останется в памяти и обработает запрос, потому что делегат все еще установлен?

Ответы [ 3 ]

3 голосов
/ 12 января 2012

Это полностью зависит от того, что NSURLConnection делает за сценой.Если количество сохранений упадет до нуля, тогда fooConn будет dealloc 'по-прежнему, и можно было бы предположить, что тогда больше не будет выполняться никаких обратных вызовов.

Теперь, я думаю, что NSURLConnection за кадром делаетполучить где-то в иерархии вещей, чтобы вы фактически получили обратные вызовы.Однако с NSURLConnection я обычно держу твердую ссылку на это, чтобы быть на безопасной стороне.В конце концов, вы, как вызывающая сторона, хотите владеть им, и вы хотите, чтобы вы продолжали получать обратные вызовы делегатов и не зависели от того, что происходит с ним под капотом.

Итак, вКороче говоря, если бы я был тобой, я бы строго ссылался на него, чтобы тебе не пришлось беспокоиться.

2 голосов
/ 12 января 2012

Из документов Apple:

- (id)initWithRequest:(NSURLRequest *)request delegate:(id < NSURLConnectionDelegate >)delegate startImmediately:(BOOL)startImmediately

Соединение сохраняет делегата.Это освобождает делегата, когда соединение заканчивает загрузку, отказывает

1 голос
/ 12 января 2012

fooConn - локальная переменная без квалификатора владения, поэтому ARC сделает ее сильной. Поэтому ARC сохранит значение, возвращаемое connectionWithRequest:delegate: при сохранении его в foxConn; и при выходе fooMethod: ARC очистится, выпустив fooConn.

То, что делегат ссылается на текущий экземпляр, не повлияет на это.

Если вы хотите, чтобы NSURLConnection существовал после того, как fooMethod: вернется, один из способов - сохранить его в переменной экземпляра (что ARC также выводит как сильное, так что квалификатор владения там также не требуется). Если вы сделаете это, когда сам экземпляр класса больше не является ссылкой, ARC выпустит NSURLConnection.

...