Ответ Олега правилен, но его нужно вникать в это дальше. Вы изучаете это определение интерфейса:
open var superview: UIView? { get }
, и вы предполагаете, что это сильное свойство. Он вообще этого не говорит. Он говорит, что UIView
имеет свойство readonly superview
. Нет сеттера, поэтому вы не ожидаете каких-либо аннотаций управления памятью (strong/weak/unowned).
Даже если он был сеттер, например, UIView.backgroundColor
:
var backgroundColor: UIColor? { get set }
Это говорит нам ровно ничего об управлении памятью. Нет никакого обещания, что этот UIColor
будет сохранен в представлении. Он может свободно создавать свою собственную копию. Это бесплатная информация об извлечении из UIColor
и генерация другого объекта для его внутреннего использования (например, CGColor
) и выбросить его. Нет никакого обещания, что backgroundColor
имеет поддержку ivar. Это бесплатно, чтобы быть вычисленным установщиком.
Некоторые свойства, как делегаты, отмечены weak
:
weak var transitioningDelegate: UIViewControllerTransitioningDelegate? { get set }
Как правило, вы можете доверять, что они не сохраняют объект передается, но помните, что это информационной, не гарантирует. Рассмотрим это совершенно юридическое (и совершенно ужасный) Swift:
class AnotherClass {
deinit { print("deinit") }
}
class MyClass {
private var _myProp: AnotherClass?
weak var myProp: AnotherClass? {
get { return _myProp }
set { _myProp = newValue }
}
}
myProp
претензий быть weak
, но на самом деле сохраняет свою ценность. Вы никогда не должны этого делать, но дело в том, что язык вас не останавливает.
Отвод от всего этого состоит в том, что, если вы заботитесь о том, чтобы объект продолжал существовать, вы несете ответственность за его сильную ссылку на него. Когда вам все равно, существует ли она, вы должны отпустить свою сильную ссылку на нее. Вам следует избегать полагаться на какой-то другой объект, чтобы поддерживать его для вас.
(На практике существует множество реальных случаев, когда невероятно удобно полагаться на то, что какой-то другой объект будет держать что-то для вас. Например, мы, конечно, полагаемся на то, что массивы содержат сильные ссылки на их содержимое, но вам нужно убедиться, что контейнер обещает такое поведение, если вам это нужно. Оглядываться на интерфейс недостаточно.)
К конкретному вопросу UIView
, это вычисленное свойство. Хотя детали реализации, вот примерно как это реализовано в прошивкой 10.1:
- (UIView *)superview {
UIView *result;
if ([UIView _isAccessingModel] != 0x0) {
id visualState = [self visualState];
result = [visualState mSuperview];
}
else {
if ([self viewFlags] & 0x400000)) {
CALayer *superLayer = CALayerGetSuperlayer([self layer]);
result = nil;
if (superlayer != nil) {
result = CALayerGetDelegate(layer);
}
}
}
return result;
}
Я не могу воспроизвести поведение. Можете ли вы опубликовать минимальный тестовый код? – shallowThought