Включение заголовков ARC в не-ARC проект - PullRequest
3 голосов
/ 06 марта 2012

Я сделал статическую библиотеку, которая была закодирована с использованием ARC.Я планирую распространять эту библиотеку для использования другими людьми.Я понимаю, что ничего не нужно делать для включения статической библиотеки ARC в не-ARC проект, но как насчет включения заголовочных файлов ARC?Например, заголовки для моей статической библиотеки ARC объявляют свойства weak и strong, но когда я пытаюсь включить эти заголовки в не-ARC проект, компилятор выходит из себя.

Есть идеи?

1 Ответ

3 голосов
/ 06 марта 2012

Для 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.

Как я уже сказал; Я не проверял ничего из этого. Пожалуйста, опубликуйте свои выводы, если это работает.

...