Краткий код для создания подвида __weak UIViewController под ARC

Обратите внимание, я не использую Interface Builder.

Я сделал свои subViews __weak так, чтобы они автоматически обнулялись в iOS 5 с помощью ARC, когда объекты, на которые они ссылаются, освобождаются. Это означает, что мне не нужно обнулять их вручную в viewDidUnload (что кажется самым безопасным шаблоном).

Однако, поскольку они слабые, я не могу напрямую назначить их своим иварам, когда я их alloc, или ARC немедленно их выпускает, единственное решение, которое я нашел, — это назначить временную сильную локальную переменную, например так:

UIView *strongTmp = [[UIView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:strongTmp];
weakIVar = strongtmp;

Это некрасиво, и его цель не сразу очевидна без подробного комментария. Я хочу что-то (более) элегантное, например:

[self.view addSubview:weakIVar = [[UIView alloc] initWithFrame:self.view.bounds]];

Но это генерирует такое же предупреждение компилятора (объект будет освобожден сразу после присваивания).

Какие-либо предложения? Заранее спасибо.


person mxcl    schedule 19.12.2011    source источник
comment
Привет, Брэд/Макс, ты нашел решение этой проблемы? Я просто столкнулся с необходимостью делать это в нескольких местах, и это действительно довольно уродливо и раздражает.   -  person SaamJB    schedule 03.01.2013


Ответы (2)


Техника «присвоить локальную переменную» совершенно нормальна. Просто привыкните к ней или используйте перо.

person rob mayoff    schedule 19.12.2011

Одно (неидеальное) решение состоит в том, чтобы добавить инициализатор уровня класса в соответствующую категорию, это фактически говорит ARC вернуть автоматически выпущенную версию вашей вещи, вот пример с UIView:

@implementation UIView (mxcl)
+ (id)viewWithFrame:(CGRect)frame {
    return [[self alloc] initWithFrame:frame];
}
@end

weakIVar = [UIView viewWithFrame:self.view.bounds];
[self.view addSubview:weakIVar];

ПРИМЕЧАНИЕ: вы можете вызвать это в любом подклассе UIView, при условии, что назначенный инициализатор подкласса все еще initWithFrame.

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

person mxcl    schedule 08.01.2013