我是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];
}
}
我现在的问题是:何时/何地应该发送'发布'消息? 感谢...
答案 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
并在创建第一个实例时加载/初始化您的资源。
注意:线程安全在这里也很重要。