use*_*876 9 memory-management objective-c ios
所以我正在编写一个继承自UIView的自定义类.我有一堆子视图,我添加.
所以遇到2个问题.如果我将superview和子视图引用强大,那么视图就会泄漏.如果我让他们变弱,他们根本就不会出现.我究竟做错了什么?
@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
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)
Mat*_* Mc 10
根据您的代码,我认为您在强引用和弱引用之间存在混淆,以及它们与内存管理的关系.
首先,这是对强弱对弱的一个很好的描述:https://stackoverflow.com/a/11013715/700471
在您的特定情况下,ownerView属性AnotherCustomUIView应该是弱的,因为它指向一个高级对象.代表参考也很弱,我不知道该设置self.delegate = self;有任何负面影响.
编辑:
为了澄清,将视图添加为另一个视图的子视图会创建一个强引用.一旦您的视图是视图层次结构的一部分,就不需要进一步强引用.所以你有这个代码:
[mySeniorView addSubView:myJuniorView]; // myJuniorView will not be released.
mySeniorView.juniorView = myJuniorView; // This shouldn't be a strong reference.
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,if mySeniorView.juniorView是一个强引用,它是多余的.如果myJuniorView从视图层次结构中删除它,则不会释放它,因为您仍然有另一个强引用.如果.juniorView是弱引用,myJuniorView则从视图层次结构中删除将导致它取消分配并设置.juniorView为nil.
这就是为什么,例如,所有的IBOutlet属性都应该很弱; 因为你连接它们的xib中的东西是视图层次结构的一部分,因此不会dealloc因为它们的高级视图具有对它们的强引用.
所以,虽然我指出你的初级对象不应该强烈引用你的高级对象(没有人会解除分配;这被称为保留周期并导致内存泄漏)可能你的高级对象不应该强烈引用你的初级,除非你想让它闲逛,即使它不在视图层次结构中.毕竟这些是观点; 我想说创建你的初级对象,将它弹出到视图层次结构中,然后在弱属性中保存对它的引用,这样你只要存在它就可以访问它.然后,当您从视图层次结构中删除它时,您的引用会消失.
无论如何,希望有所帮助.
| 归档时间: |
|
| 查看次数: |
5867 次 |
| 最近记录: |