
所以遇到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子视图强大与弱的最佳实践所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)