我在类方法初始化中分配内存:
UIColor * customBlue;
UIColor * customRed;
@implementation UIColorConstants
+ (void)initialize{
if ( self == [UIColorConstants class] ) {
customBlue = [[UIColor alloc]initWithRed:0 green:0.137 blue:0.584 alpha:1];
customRed = [[UIColor alloc]initWithRed:.91 green:0.067 blue:0.176 alpha:1];
}
}
+ (UIColor *)getCustomRed{
return customRed;
}
+ (UIColor *)getCustomBlue{
return customBlue;
}
@end
释放已分配内存的最佳/正确位置在哪里,因为没有对应的自动调用初始化?
答案 0 :(得分:4)
在你给出的例子中,我不打扰清理。内存量非常小,清理的唯一适当位置是应用程序退出时,此时你真的不再关心这些对象了。
你可能会考虑的一件事就是不要保持这些颜色,只需这样做:
+ (UIColor*) customRedColor {
return [[[UIColor alloc]initWithRed:0 green:0.137 blue:0.584 alpha:1] autorelease];
}
然后你有一些有用的小助手方法,它们不需要那些对象。只是呼叫者有责任确保颜色是否保留。
在iOS 4.0多任务处理环境中,这可能也是更好,更简单的行为。
答案 1 :(得分:3)
没有一个,所以你不释放那个记忆;当您的进程退出时,操作系统会回收它。加载并初始化后,该类会在整个过程执行过程中持续存在(禁止某人调用-[NSBundle unload]
)。预计班级数据将保持相同的持续时间。
如果您有很多班级数据,可以尝试懒惰地初始化它,例如:
+ (UIColor *)getCustomBlue {
static UIColor *customBlue = nil;
if (!customBlue) customBlue = [[UIColor alloc] initWithRed:0.0 green:0.137 blue:0.584 alpha:1.0];
return customBlue;
}
在请求之前,不会创建 customBlue
。如果没有人使用它,那么它永远不会被创建,并且永远不会使用任何堆内存。
ETA: St3fan是正确的,你也可以按需创建一个新的自动释放颜色。如果创作成本低廉,这可能是最好的选择。
如果您的某个资源由于某种原因无法被操作系统回收,您可以使用atexit()
注册一个出口处理程序来执行清理:
static void
CleanupColors(void) {
[customBlue release], customBlue = nil;
[customRed release], customRed = nil;
}
+ (void)initialize {
if (...) {
...
atexit(CleanupColors);
}
}