gpt4 book ai didi

uiview - 可插入自定义 View Nib (Nib-in-a-Nib) : Memory leak – why?

转载 作者:行者123 更新时间:2023-12-02 08:24:58 28 4
gpt4 key购买 nike

我们当前的best-practice for custom views是:

  1. 在 Nib 中构建自定义 View 。
  2. 在 View Controller 中,以编程方式加载 Nib,从加载的对象数组中获取自定义 View (我们在 UIView 类别方法 +loadInstanceFromNib 中执行此操作)。
  3. 添加自定义 View 作为 subview ,设置其框架。

我们实际上想要的是将自定义 View Nib“嵌入” View Controller Nib中。如果做不到这一点,至少我们想添加和将自定义 View 实例放置在 View Controller 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

如果我们以编程方式实例化自定义 View ,我们将使用 -initWithFrame:,它将从 Nib 加载 View (它将调用 -initWithCoder: 并直接转到标记为“步骤 2”的 if 分支),设置其框架,并将其保留计数设置为 1。

但是,如果我们在 View Controller Nib 内实例化自定义 View ,(诚然相当难看)静态 loadNormally 变量最初是 NO:我们从“第 1 步”开始”,在确保我们将立即使用 -initWithCoder: 的“正常”if 分支之后,我们加载并返回从其 Nib 加载的实例。从自定义 View Nib 加载意味着我们回到 -initWithCoder:,这次使用 loadNormally==YES,即我们让 Nib 加载机制完成其工作并返回自定义 View 实例。

结果总结:

  • 好处:它有效!!!我们在 Interface Builder 中有“可插入”自定义 View !
  • 坏处:一个丑陋的静态变量…:-/
  • 丑陋的地方: 自定义 View 的实例被泄露!这就是我需要您帮助的地方 - 我不明白为什么。有什么想法吗?

最佳答案

我们最终找到了一种更好的方法,其中涉及在自定义 View 中覆盖 -awakeAfterUsingCoder: ,将从 View Controller Nib 加载的对象替换为从“嵌入式”Nib 加载的对象( CustomView.xib)。

我写了how we embed custom-view Nibs inside other Nibs在一篇内容广泛的博客文章中。

代码是这样的:

// CustomView.m
- (id) awakeAfterUsingCoder:(NSCoder*)aDecoder {
BOOL theThingThatGotLoadedWasJustAPlaceholder = ([[self subviews] count] == 0);
if (theThingThatGotLoadedWasJustAPlaceholder) {
// load the embedded view from its Nib
CustomView* theRealThing = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([CustomView class]) owner:nil options:nil] objectAtIndex:0];

// pass properties through
theRealThing.frame = self.frame;
theRealThing.autoresizingMask = self.autoresizingMask;

[self release];
self = [theRealThing retain];
}
return self;
}

关于uiview - 可插入自定义 View Nib (Nib-in-a-Nib) : Memory leak – why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6357547/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com