ios – 自定义UIView子视图强大与弱的最佳实践

前端之家收集整理的这篇文章主要介绍了ios – 自定义UIView子视图强大与弱的最佳实践前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我正在编写一个继承自UIView的自定义类.我添加了一堆子视图.

所以遇到2个问题.如果我将superview和子视图引用强大,那么视图就会泄漏.如果我让他们变弱,他们根本就不会出现.我究竟做错了什么?

CustomUIView

@interface CustomUIView : UIView
@property(nonatomic,strong) AnotherCustomUIView *mySubView;
@end

@implementation CustomUIView {

- (void)initCommon {
    self.mySubView = [self createSubView]
}

- (AnotherCustomUIView *) createSubView {
    return [[AnotherCustomUIView alloc] init:self];
}

@end

AnotherCustomUIView

@interface AnotherCustomUIView : UIScrollView
@property (nonatomic,strong) CustomUIView *ownerView;
@end


@implementation AnotherCustomUIView

- (id)init:(CustomUIView *) ownerView {
    self = [super init];
    if (self) {
        self.ownerView = ownerView;
        self.delegate = self;
    }
    return self;
}

@end

解决方法

根据您的代码,我认为您在强引用和弱引用之间存在混淆,以及它们与内存管理的关系.

首先,这是对强弱对比的一个很好的描述:https://stackoverflow.com/a/11013715/700471

在您的特定情况下,AnotherCustomUIView上的ownerView属性应该是弱的,因为它指向一个高级对象.委托引用也很弱,我不知道设置self.delegate = self;有任何负面影响.

编辑:

为了澄清,将视图添加为另一个视图的子视图会创建一个强引用.一旦您的视图是视图层次结构的一部分,就不需要进一步强引用.所以你有这个代码

[mySeniorView addSubView:myJuniorView]; // myJuniorView will not be released.
mySeniorView.juniorView = myJuniorView; // This shouldn't be a strong reference.

在上面的代码中,如果mySeniorView.juniorView是一个强引用,它是多余的.如果从视图层次结构中删除myJuniorView,它将不会被释放,因为您仍然有另一个强引用.如果.juniorView是一个弱引用,那么从视图层次结构中删除myJuniorView将导致它取消分配并将.juniorView设置为nil.

这就是为什么,例如,所有的IBOutlet属性都应该很弱;因为你连接它们的xib中的东西是视图层次结构的一部分,因此不会dealloc因为它们的高级视图具有对它们的强引用.

所以,虽然我指出你的初级对象不应该强烈引用你的高级对象(没有人会解除分配;这被称为保留周期并导致内存泄漏)可能你的高级对象不应该强烈引用你的初级,除非你想让它闲逛,即使它不在视图层次结构中.毕竟这些是观点;我想说创建你的初级对象,将其弹出到视图层次结构中,然后在弱属性中保存对它的引用,这样只要存在它就可以访问它.然后,当您从视图层次结构中删除它时,您的引用会消失.

无论如何,希望有所帮助.

参考:Apple Docs,addSubview:

猜你在找的iOS相关文章