有没有办法枚举所有属性并逐个释放它们?

时间:2011-09-19 14:11:11

标签: objective-c xcode autorelease

典型的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(几乎相当)

3 个答案:

答案 0 :(得分:1)

你不是在这里枚举属性,而是实例变量(可能是属性关联的支持变量,当然,但可能不是,你没有给出声明属性的代码,所以我们无法知道)

我的建议:

  • 使用现代运行时的功能(iOS使用,因为iOS存在 - 而OSX仅使用64位)自动生成属性的后备存储。因此,您不需要在头文件中为属性声明实例变量,也不会试图直接使用实例变量而不是属性
  • dealloc - 和viewDidUnload方法中,绑定到IBOutlets的属性 - 将@properties设置为nil(而不是释放ivar
  • 最后,一旦您以这种方式管理您的属性,就可以通过内省将所有属性设置为nil。

一旦您按照上述说明进行操作,您可以使用内省:使用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中运行您的应用程序。这样可以解决泄漏问题,并且可以节省时间来追踪泄漏内存中可能发生的奇怪错误。