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

Objective c +;(void)初始化和内存问题,objective-c,Objective C,我是Objective-c新手,在阅读了一些关于良好实践的文章之后,(void)initialize class方法似乎是初始化全局静态变量的最佳位置: static NSArray *tableCellBackgrounds = nil; + (void)initialize { if (self == [VariableDisplayViewController class]) { tableCellBackgrounds = [NSArray arrayW

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

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];
    }
}
我现在的问题是:我应该在何时/何地发送“发布”消息? 谢谢……

好吧,你不用:)


关闭应用程序时,应用程序的内存将被释放,因此这不是问题。但是,如果在你的单身生活中打开了需要在应用程序关闭时关闭的文件句柄,那么可能会有问题。

我不同意Joris的说法,你不需要释放这些句柄

有时,您会在
+(void)initialize
中分配相当大的静态/全局表和数据,这些表和数据服务于特定类的所有实例,但当您释放该类的最后一个实例时,您会希望将这些资源从内存中丢弃,而不是等待整个应用程序进程关闭

不幸的是,我在ObjC NSObject方法中没有发现任何“
+(void)去初始化”
”,因此我可以建议的唯一技术是也重写类方法

+ (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");
+ (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

然后,当您的实例计数变为零时,继续并释放您分配的全局值(如果需要)

不过要注意:+(void)initialize在创建新实例时不会再次调用


更多注意事项:线程安全在这里也应该很重要。

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

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

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

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

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

不幸的是,我在ObjC NSObject方法中没有发现任何“
+(void)去初始化”
”,因此我建议您采用手动管理的方法

为此,还需要重写类方法

+ (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");
+ (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
,在创建第一个实例时加载/初始化资源

警告:线程安全在这里也应该很重要