Как заменить слабые ссылки при использовании ARC и ориентации на iOS 4.0? - PullRequest
87 голосов
/ 01 августа 2011

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

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

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

Это ссылка на эту строку:

@synthesize delegate = _delegate;

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

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

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

Ответы [ 3 ]

149 голосов
/ 05 августа 2011

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

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

11 голосов
/ 29 августа 2011

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

ZWRCompatibility.h несколько упростит это.

10 голосов
/ 29 июня 2012

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

Это невероятно легко настроить и не требует дополнительных усилий или усилий в течение 5.x.

...