как использовать делегатов с автоматическим подсчетом ссылок - PullRequest
45 голосов
/ 30 июня 2011

Я вскочил на подножку ARC.В прошлом мои свойства делегата объявлялись так:

@property(assign) id<MyProtocol> delegate;

Поэтому я подумал, что сделаю это в ARC:

@property(weak) id<MyProtocol> delegate;

Не так.В операторе @synthesize в .m у меня есть ошибка компиляции :

* Семантическая проблема: существующий ivar 'делегат' для __weak свойства 'делегат' должен быть __weak *

Я объявил это слабым, хотя!Также как передать класс, реализующий протокол, в свойство со слабой ссылкой.Должен ли я обернуть это в один из тех странных вызовов obj_unretained?

Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

65 голосов
/ 30 июня 2011

«ivar» означает «переменная экземпляра», которую вы не показывали.Держу пари, что это выглядит примерно так:

@interface Foo : NSObject {
    id delegate;
}

@property (weak) id delegate;

Ошибка говорит о том, что она должна выглядеть так:

@interface Foo : NSObject {
    __weak id delegate;
}

@property (weak) id delegate;

Если свойство претендует на слабость,ivar, в котором хранится значение, также должно быть слабым.

...