Для strong
вы можете просто использовать retain
. Они идентичны.
weak
хитрее, и хотя я знаю несколько способов, которые должны работать, я не уверен, что лучший способ справиться с этим.
Во-первых, убедитесь, что вам это действительно нужно. Если вы поддерживаете iOS4, у вас все равно не будет weak
, так что проблема спорная. У меня такое чувство, что я, вероятно, просто избегу weak
и устраню все эти проблемы. слабый - это хорошо, но в большинстве случаев это не так уж и сложно.
Тем не менее, есть некоторые подходы, которые будут работать. Лучше всего, вероятно, объявить weak
методы доступа без свойств в заголовке. Вместо этого:
@property (nonatomic, readwrite, weak) id delegate;
Сделайте это:
- (id)delegate;
- (void)setDelegate:(id)aDelegate;
Тогда вы все равно можете объявить свойство weak
внутри вашего файла реализации. Для этого вызывающая сторона все еще может использовать точечную нотацию.
Возможно, здесь вы получите ошибку компиляции, поскольку setDelegate:
технически занимает __strong id
. Если это так, просто ручной инструмент setDelegate:
- (void)setDelegate:(id)aDelegate {
_delegate = aDelegate;
}
Не проверял, но это должно сработать. Вы также можете объявить ivar _delegate
как __weak
в блоке @implementation
вместо того, чтобы объявлять его как свойство weak
.
Как я уже сказал; Я не проверял ничего из этого. Пожалуйста, опубликуйте свои выводы, если это работает.