Как заменить слабые ссылки при использовании ARC и таргетинга на iOS 4.0?

Я начал разрабатывать свое первое приложение для iOS с Xcode 4.2 и ориентировался на iOS 5.0 с шаблоном "утилиты" (тот, который поставляется с FlipsideViewController).

Я читал, что, поскольку ARC - это функция времени компиляции, она также должна быть совместима с iOS 4, поэтому я попытался настроить таргетинг на мое приложение на 4.3 и попробовать его компилировать. Когда я это сделаю, я получаю эту ошибку:

FlipsideViewController.m: ошибка: автоматическая ошибка подсчета ссылок: текущая цель развертывания не поддерживает автоматические ссылки __weak

Он ссылается на эту строку:

@synthesize delegate = _delegate;

Эта переменная объявляется как:

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;

Я понимаю, что "слабые ссылки" не поддерживаются в iOS 4, но я действительно не понимаю, почему я хотел бы использовать слабую ссылку для начала, и не могу понять, как я буду переписывать вещи, чтобы избежать использования он, все еще пользуясь ARC (в конце концов, он должен работать с iOS 4 и 5 правильно?)

Ответ 1

Чтобы настроить таргетинг на более старую ОС, вы можете использовать unsafe_unretained вместо weak в объявлении свойства, и она должна работать в основном так же. weak ссылается на нуль, когда их цель уходит, но unsafe_unretained оставляет открытой возможность того, что объект, с которым вы связываетесь, может превратиться в обвисшего указателя при его освобождении. Последнее такое же поведение, как если бы вы использовали assign как объявление свойства в ручном управлении памятью.

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

Ответ 2

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

ZWRCompatibility.h упростит это.

Ответ 3

Благодаря библиотеке совместимости Mike Ash PLWeakCompatibilty теперь вы можете просто использовать __weak на iOS 4.x.

Он невероятно прост в настройке и не требует дополнительного внимания или усилий над 5.x.