迭代UIViewController的属性和IBOutlets

时间:2010-06-02 10:02:48

标签: iphone memory-management

我的应用程序上有一个通用的UIViewController。应用程序上的所有UIViewController都继承自这个通用的。

我正在尝试将属性和IBOutlet的释放和释放自动化为属性。

我在 dealloc 方法上执行第一个(属性),在 viewDidUnload 上执行第二个(属性)的IBOutlets。

- (void) dealloc {
  [_att1 release];
  _att1 = nil;

  [_att2 release];
  _att2 = nil;

  // ...
}

- (void) viewDidUnload {
   self.att1 = nil; // att1 is an IBOutlet
   self.att2 = nil; // att2 is an IBOutlet

   // ...
}

有没有办法迭代我的所有属性和IBOutlets来简化这些操作?我想避免为每个插座和属性执行此操作并将其委托给通用UIViewController。

感谢。

3 个答案:

答案 0 :(得分:5)

我不确定这是可能的。此外,我不确定这是个好主意。

首先,为什么不可能:IBOutlet关键字仅用于Interface Builder。 IB扫描源代码(或源代码的一些XCode内部索引)以识别类中可用的IBOutlet。我不认为在编译代码中IBOutlet和常规属性之间有任何区别。因此,即使您找到属性或属性列表,也无法区分-[UIView viewDidUnload]而非dealloc的内容。

其次,为什么这不是一个好主意。 Objective-C中的内存管理很复杂。 Instruments中的工具还可以帮助确定分配多余内存的位置,而Clang静态分析器(XCode中的Cmd-Shift-A)可以帮助您找到未发布或不正确保留对象的潜在内存泄漏。任何基于内省的发布自动化系统肯定会混淆静态分析器,更不用说团队中的其他开发人员了。

尝试自动执行像内存管理这样容易出错的任务是一项非凡的努力,但我认为您可能最好不要使用现有工具并等待垃圾收集器找到通往iPhone的方式。 / p>

答案 1 :(得分:0)

如果他们真的只是命名为attr1,attr2,attr3 ......那么你可以。

使用键值编码

例如:

for(int i = 1; i <= numberOfAttributes; ++i) {

    [self setValue: nil forKey: [NSString stringWithFormat: @"%@%i", @"attr", i]];
    [[self valueForKey: [NSString stringWithFormat: @"%@%i", @"attr", i] release];
}

请注意,您必须自己设置numberOfAttributes。


但是如果你无法跟踪属性的nubmer,或者有很多属性,你应该考虑使用数组来收集它们

答案 2 :(得分:0)

尝试使用IBOutlets获取所有[self.view subviews]并浏览数组以删除它们。

对于属性,我还在寻找......