+(void)初始化和内存问题

时间:2011-03-31 09:04:27

标签: objective-c

我是Objective-c的新手,在阅读了一些关于良好实践的文章之后,似乎(void)initialize类方法是初始化全局静态变量的最佳位置:

static NSArray *tableCellBackgrounds = nil;

+ (void)initialize
{
    if (self == [VariableDisplayViewController class])
    {
        tableCellBackgrounds = [NSArray arrayWithObjects:
            [[UIImage imageNamed:@"ListLine_Pair.png"] stretchableImageWithLeftCapWidth:40 topCapHeight:27],
            [[UIImage imageNamed:@"ListLine_Impair.png"] stretchableImageWithLeftCapWidth:40 topCapHeight:27],
            nil
        ];
        [tableCellBackgrounds retain];
    }
}

我现在的问题是:何时/何地应该发送'发布'消息? 感谢...

2 个答案:

答案 0 :(得分:2)

嗯,你没有:)

关闭应用程序时,应用程序的内存无论如何都会被释放,这不是问题。可能会出现问题,如果你的单身人士打开文件句柄,需要在app关闭时关闭。

答案 1 :(得分:0)

我不同意 Joris 的观点,即您不需要发布这些内容。

您的问题暗示您在 +(void)deinitialise 中作为静态/全局加载的资源供特定类的所有实例内部使用。

此类资源可能占用大量内存(特殊算法所需的数据块、常量数据表、图像等。

当这个类的最后一个实例被释放时 - 释放全局“类”数据是有意义的,并且只有在创建类的新实例时才再次加载它们。

显然,您不想等待整个应用程序进程关闭。

不幸的是,我在 ObjC NSObject 方法中没有发现任何“+(void)deinitialise”,所以我建议的技术是您手动管理它。

为此,您还需要覆盖类方法

+ (instancetype)allocWithZone:(struct _NSZone *)zone OBJC_SWIFT_UNAVAILABLE("use object initializers instead");
+ (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead");
- (void)dealloc OBJC_SWIFT_UNAVAILABLE("use 'deinit' to define a de-initializer");

保持类实例的数量,在“alloc”和“allocWithZone”上加1,在“dealloc”上减1。 (当然先调用super)。

然后,当您的实例数变为零时 - 如果需要,继续释放您分配的那些全局变量。

您也可以忘记 +(void)initialize 并在创建第一个实例时加载/初始化您的资源。

注意:线程安全在这里也很重要。