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

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

概述所以我正在编写一个继承自UIView的自定义类.我添加了一堆子视图. 所以遇到2个问题.如果我将superview和子视图引用强大,那么视图就会泄漏.如果我让他们变弱,他们根本就不会出现.我究竟做错了什么? CustomUIView @interface CustomUIView : UIView@property(nonatomic, strong) AnotherCustomUIView * 所以我正在编写一个继承自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因为它们的高级视图具有对它们的强引用.

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

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

参考:Apple Docs,addSubview:

总结

以上是内存溢出为你收集整理的ios – 自定义UIView子视图强大与弱的最佳实践全部内容,希望文章能够帮你解决ios – 自定义UIView子视图强大与弱的最佳实践所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1105508.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存