【问题标题】:Reinstantiating Instance Variables - a design query重新实例化实例变量 - 设计查询
【发布时间】:2013-08-07 06:35:13
【问题描述】:

我目前正在我的应用程序中使用我将在下面描述的范例并且它有效,所以这不是一个大问题;但是,我想知道我是否违反了这种模式的某种规则。

我正在使用 ARC。

我有一个显示模态视图控制器的应用程序。它上面有一个表格视图。

然后我有一个“添加”按钮,允许我在表格视图中输入一些数据。

按下添加,会弹出一个从 UIView 创建的小对话框,其中包含许多文本字段。 - 每个文本字段都是一个实例变量。

当我的 add 方法被调用时,我正在分配初始化 textField 实例变量。

我的问题是:是否可以在我的 viewController 上调用这个 add 方法来实例化实例变量并使用它们,然后再次调用相同的方法,这将在已经分配的实例变量上调用 alloc init 和上次调用该方法时初始化。

因此在相同的 ivars 上调用 alloc init 而不先将它们 nil - 我也在使用 ARC?

类似这样的伪代码:

.h

@property UITextField *textField;

.m

@synthesize textField;



(void) someMethod {

textField = [[UITextField alloc] init] 
[textField doSomethingElse]

}

稍后

一些方法被反复调用。

我应该改为分配初始化所有文本字段,然后在 add 方法中从我的 UIView 中添加和删除它们吗?

谢谢, 问候, 约翰

【问题讨论】:

  • 如果您要重用文本字段,那么每次调用该方法时都没有必要一遍又一遍地创建它们,您不觉得吗?
  • 当然,我怎样才能避免一遍又一遍地创建它们,也许只是在 viewDidLoad 中分配初始化?

标签: ios objective-c cocoa-touch uikit


【解决方案1】:

根据定义,您不能在现有实例上调用 alloc。您正在做的是导致旧实例被销毁并创建新实例来替换它们。这并没有什么问题,但它可能会非常浪费,并且取决于创建这些实例的难度,而且很耗时。

【讨论】:

  • 好的,所以每次在 ivar ARC 上再次调用 alloc init 都会销毁旧的并替换它?所以没有泄漏?....这听起来不错,更优雅的方法是:在 viewdid 加载中分配 init ivars,然后在我的 add 方法中将它们作为子视图从我的 uiview 添加和删除?
  • 什么是浪费?将不需要的东西留在内存中会很浪费。
  • @Mundi,如果您可以更新现有项目,那么重新创建现有项目是浪费的。如果您不再需要它,那么在一段时间内不再需要它时应该将其销毁,并且重新创建它的成本很高。
  • 不确定是这种情况。如果他正在推动模态视图控制器,则标准过程是解除分配并重新创建。如果他只是想让视图消失并重新出现(一个相当奇怪的设置),那么隐藏和显示它们会更简单。
【解决方案2】:

当您的添加控制器被解除时,ARC 应该负责解除分配所有实例变量。因此,当您再次需要它们时重新创建它们并没有什么坏处。

【讨论】:

  • 有没有更好的方法可以只创建一次但仍然对整个班级有效?
  • 实际上,当你不再需要它们时最好忘记它们,并在以后再次需要它们时重新创建它们。否则,您会将无用的内容保存在内存中。如果出现性能问题,您可以缓存以后需要的东西,但在您的设置中肯定不是这种情况。
  • 如果我不使用 ivars 如何在我的应用程序的另一部分提取 textField 文本?如果我在 viewdidLoad 中分配初始化 ivars,然后添加它们并将它们从 uiview 中删除,这是一个好的解决方案吗?
  • 查看我对其他答案的评论。
猜你喜欢
  • 2014-10-05
  • 2014-12-26
  • 2014-12-26
  • 2020-07-27
  • 2020-07-04
  • 1970-01-01
  • 2015-04-26
  • 2021-06-18
  • 2020-08-05
相关资源
最近更新 更多