Метод делегата не срабатывает (равно нулю). Использование АРК

У меня возникли проблемы с запуском моего метода делегата. У меня есть следующий код:

@class Location;
@protocol LocationDelegate
- (void)location:(Location*)location foundLocation:(CLLocation*)location;
- (void)location:(Location*)location failedToLocateUserWithError:(NSError*)error;
@end 

@interface Location : NSObject {
    __unsafe_unretained id <LocationDelegate> delegate;
}

@property (nonatomic, assign) id <LocationDelegate> delegate;

@end

...
@implementation Location

@synthesize delegate;

- (void)startUpdatingLocation {
    NSLog(@"%@", delegate); // prints '(null)'
    ...

}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    NSLog(@"%@", delegate); // prints '(null)'
    [delegate location:self foundLocation:newLocation];
}

@end

Раньше нормально работал для других проектов, поэтому интересно, связано ли это с ARC? Объект, который выделяет Location, действительно соответствует LocationDelegate. Я также устанавливаю делегата на себя. Но метод делегата просто не срабатывает, и если я его вывожу, он равен нулю.

Спасибо


person runmad    schedule 21.10.2011    source источник


Ответы (2)


Только из кода, который вы вставили сюда, я не вижу ничего, что удерживает ваш делегат (сохраненная ссылка).

Все, что вы вставили, показывает, что вы изо всех сил пытаетесь не сохранить делегат в этом коде.

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

Объект, который выделяет Location, соответствует LocationDelegate. Я также устанавливаю делегата на себя.

И у кого есть сильная ссылка на этот объект?

person Steve    schedule 21.10.2011
comment
Я пытался изменить его на (неатомный, сильный) и не на unsafe_unretained, но все равно ничего. - person runmad; 21.10.2011
comment
Избавьтесь от ивара. В строках, где вы ссылаетесь на делегата (например, эта: [delegate location....), вместо этого используйте self.delegate. - person Steve; 21.10.2011
comment
После назначения добавьте часы в отладчик, тогда вы увидите, когда они обнулятся. - person Steve; 21.10.2011
comment
Вы сказали, что в какой-то момент присваивали свойство делегата. Поставьте точку останова на этой строке. Перешагните через это. Затем добавьте часы в отладчик. - person Steve; 21.10.2011
comment
В классе я выделяю Location, я устанавливаю location.delegate = self; - person runmad; 21.10.2011
comment
Должен ли я снова скопировать и вставить мое последнее предложение? Поместите точку останова в этой строке. Перешагните через это. Затем добавьте часы в отладчик. - person Steve; 21.10.2011
comment
Я согласен с @Steve. Похоже, что где бы вы ни размещали объект делегата, вы не сохраняете его. Таким образом, вы можете успешно установить его, но он будет освобожден к моменту запуска ваших методов делегата. Почему бы вам не опубликовать код, где создать объект делегата и назначить его? - person Christopher Pickslay; 22.10.2011
comment
Обновлять. Я подтвердил, что другой класс с делегатом работает нормально. Код был идентичен, кроме имен. Я создал еще один класс, скопировал точные строки кода для делегата Location, и он отлично работал, очень странно и очень разочаровывающе. Не уверен, что, черт возьми, происходит. Но спасибо за всю вашу помощь, несмотря ни на что. - person runmad; 22.10.2011

Везде, где вы выделяете Location, вы назначили делегата? Например: Location *location = [[Location alloc] init]; location.delegate = self;

person Rick    schedule 21.10.2011
comment
Он конкретно сказал, что он: I am also setting the delegate to self. - person Steve; 21.10.2011
comment
Попробуйте добавить ‹NSObject› после @protocol LocationDelegate. - person Rick; 24.10.2011