典型的dealloc
好吧很糟糕。如果我忘记了dealloc属性怎么办?
为什么我们不能像dealloc所有属性
那样最糟糕的是,我有点像现在处理viewControllers的方式。我们把一个属性和poof放在dealloc上。在普通班上不能有这个吗?
- (void)dealloc
{
[_window release];
[__managedObjectContext release];
[__managedObjectModel release];
[__persistentStoreCoordinator release];
[_MainBadgerApplication release];
[_SettingsMiscelaneous release];
[_theNearByIsiKota release];
[Customcell release];
[PhoneCC release];
[searchViewController release];
[_superTabBar release];
[_SuperNavBar release];
[pinNumberView release];
[_lblForPinNumber release];
[navController release];
[NearbyShortcut release];
[_searchListView release];
[_searchNearView release];
[LoadingView release];
[super dealloc];
}
我正在考虑一个我可以做的宏
myDealloc
这将枚举所有属性并逐个释放它们或将它们设置为nil(几乎相当)
答案 0 :(得分:1)
你不是在这里枚举属性,而是实例变量(可能是属性关联的支持变量,当然,但可能不是,你没有给出声明属性的代码,所以我们无法知道)
我的建议:
dealloc
- 和viewDidUnload
方法中,绑定到IBOutlets的属性 - 将@properties
设置为nil(而不是释放ivar 一旦您按照上述说明进行操作,您可以使用内省:使用functions of the Objective-C Runtime获取给定类的每个@property
,然后查看它们并设置它们到nil
(将释放与@property
相关联的支持变量的内存)
答案 1 :(得分:1)
这看起来像一个可怕的想法,所以这里是代码:D这将遍历代码上的每个对象属性并发送一个版本。我没有编译它,但它或多或少都是这样的。
#import <objc/runtime.h>
unsigned int propertyCount;
objc_property_t *properties = class_copyPropertyList([self class], &propertyCount);
for (unsigned int i = 0; i < propertyCount; i++)
{
SEL sel = @selector(release);
const char *attr = property_getAttributes(properties[i]);
switch (attr[1]) {
case '@':
property_getName(properties[i]), objc_msgSend(self, sel)]
break;
default:
break;
}
}
free(properties);
您可以将其包装在C函数中并从dealloc中调用它。
答案 2 :(得分:1)
我建议采用另一种方法。首先,在init或dealloc中将属性设置为nil违反了Apple的指导原则。这是因为您可以调用setter方法。例如,如果开发人员已覆盖标准属性设置器并定义了自定义setter方法。
在这种情况下,在init或dealloc期间调用这样的方法会产生不可预测的结果。
最好调用[myIvar release];照常。
要跟踪缺失的发布语句,请运行Analyzer。或者,更好的是,将目标的构建设置设置为在执行构建时始终运行Analyzer。
最后,值得定期在Instruments中运行您的应用程序。这样可以解决泄漏问题,并且可以节省时间来追踪泄漏内存中可能发生的奇怪错误。