Присвоение сохраненного объекта слабой собственности; объект будет выпущен после присвоения
Я использовал некоторый исходный код:
KGModalContainerView *containerView =
self.containerView =
[[KGModalContainerView alloc] initWithFrame:containerViewRect];
Он дает мне: Assigning retained object to weak property; object will be released after assignment
изменить
@interface KGModal()
@property (strong, nonatomic) UIWindow *window;
@property (weak, nonatomic) KGModalViewController *viewController;
@property (weak, nonatomic) KGModalContainerView *containerView;
@property (weak, nonatomic) UIView *contentView;
@end
KGModalContainerView *containerView =
self.containerView =
[[KGModalContainerView alloc] initWithFrame:containerViewRect];
containerView.modalBackgroundColor = self.modalBackgroundColor;
containerView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleBottomMargin;
containerView.layer.rasterizationScale = [[UIScreen mainScreen] scale];
contentView.frame = (CGRect){padding, padding, contentView.bounds.size};
[containerView addSubview:contentView];
[viewController.view addSubview:containerView];
Ответы
Ответ 1
Я предполагаю, что ваше свойство containerView
объявлено атрибутом weak
. Если вы хотите иметь атрибут weak
для свойства, которое кто-то должен его уже сохранить. Вот пример:
@property (nonatomic, weak) KGModalContainerView *containerView;
...
-(void)viewDidLoad {
[super viewDidLoad];
KGModalContainerView *myContainerView = [[KGModalContainerView alloc] initWithFrame:containerViewRect]; // This is a strong reference to that view
[self.view addSubview:myContainerView]; //Here self.view retains myContainerView
self.containerView = myContainerView; // Now self.containerView has weak reference to that view, but if your self.view removes this view, self.containerView will automatically go to nil.
// In the end ARC will release myContainerView, but it retained by self.view and weak referenced by self.containerView
}
Ответ 2
Мои 2 цента как новичок в Objective C:
Правая сторона строки, которая дает предупреждение,
[[KGModalContainerView alloc] initWithFrame:containerViewRect]
создает объект в куче, и в этот момент этот объект не ссылается никаким указателем. Затем этот объект присваивается self.containerView
. Поскольку self.myContainerView
слаб, присваивание не увеличивает счетчик ссылок объекта, созданного с правой стороны. Поэтому, когда назначение выполнено, счетчик ссылок объекта по-прежнему равен 0, и, следовательно, ARC немедленно освобождает объект.