我的应用程序上有一个通用的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。
感谢。
答案 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]
并浏览数组以删除它们。
对于属性,我还在寻找......