Краткий код для создания __weak UIViewController subView под ARC - PullRequest
1 голос
/ 19 декабря 2011

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

Я сделал мои подпоказы __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]];

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

Есть предложения? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

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

0 голосов
/ 08 января 2013

Одно (неидеальное) решение состоит в том, чтобы добавить инициализатор уровня класса к соответствующей категории, это фактически говорит 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.

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

...