可插拔的自定义视图笔尖(Nib-in-a-Nib):内存泄漏–为什么?
|
我们当前针对自定义视图的最佳做法是:
在笔尖中构建自定义视图。
在视图控制器中,以编程方式加载Nib,从加载的对象数组中获取自定义视图(我们在UIView类别方法
+loadInstanceFromNib
中进行此操作)。
将自定义视图添加为子视图,设置其框架。
我们真正想要的是将“自定义视图Nib”“嵌入”视图控制器Nib中。失败了,至少我们想在视图控制器Nib中添加并放置一个自定义视图实例(不查看其内容)。
我们非常接近以下解决方案:
@implementation CustomView
static BOOL loadNormally;
- (id) initWithCoder:(NSCoder*)aDecoder {
id returnValue = nil;
if (loadNormally) { // Step 2
returnValue = [super initWithCoder:aDecoder];
loadNormally = !loadNormally;
} else { // Step 1
loadNormally = !loadNormally;
returnValue = [CustomView loadInstanceFromNib];
}
return returnValue;
}
- (id) initWithFrame:(CGRect)frame {
loadNormally = YES;
self = (id) [[CustomView loadInstanceFromNib] retain];
self.frame = frame;
return self;
}
// ...
@end
如果我们以编程方式实例化自定义视图,则使用-initWithFrame:
,它将从Nib加载视图(将调用-initWithCoder:
并转到标记为“步骤2”的if分支),设置其框架并设置其保留数到1。
但是,如果我们在视图控制器Nib中实例化自定义视图,则(相当丑陋的)静态loadNormally
变量最初是ѭ5We:我们从\“ Step 1 \”开始,在该处加载并返回从其Nib加载的实例,之后确保我们立即使用\“ normal \” if-branch-initWithCoder:
。从自定义视图Nib加载意味着我们回到-initWithCoder:
,这次是loadNormally==YES
,即我们让Nib加载机制完成其工作并返回自定义视图实例。
结果总结:
优点:它有效!!!在Interface Builder中,我们具有“可插入”自定义视图!
坏处:丑陋的静态变量…:-/
丑陋:自定义视图的实例被泄漏!这就是我希望您的帮助的地方-我不明白为什么。有任何想法吗?
没有找到相关结果
已邀请:
3 个回复
容淑阔九
疾桓
UIView + Util类别代码为
及其实施
田眯衅
中使用
,然后创建另一个名为ѭ16view的视图,
有一个对应的
文件,您已在linked19ѭ和
中链接了出口。 然后,在
中写下:
这样,您就可以在需要将自定义视图放在ѭ15中的位置使用
,从而使
在ѭ15中可以重用,而无需编写任何其他代码。