UIColor内存泄漏问题

时间:2011-05-04 22:48:27

标签: objective-c memory-management memory-leaks

我一直在努力解决这个问题。基本上我使用方便的RGB UIColor函数返回UIColor来为我的UINavigationBar,UIToolbar和其他对象着色。但是出于某种原因,在仪器中,它一直在说我每次加载UIView时都有内存泄漏。任何帮助,将不胜感激。为了清晰起见,我在这里简化了代码。这是我的函数(函数有RGB和Alpha作为变量),它位于Global单例类中:

- (UIColor *)returnSelectedColor{
    return [UIColor colorWithRed:(100)/255.0 green:(100)/255.0 blue:(100)/255.0 alpha:(1.0)];
}

在我的RootViewController中,我在ViewWillAppear中设置了它(有时色调可以在调用之间改变,但我尝试了ViewDidLoad,但问题仍然存在)。我尝试了两种不同的方法来解决这个问题,但仍然存在泄漏。

第一种方法是在视图显示时设置色调:

self.navigationController.navigationBar.tintColor=[[GlobalData sharedGlobalData] returnSelectedNavigationColor];

第二种方法是为视图创建一个UIColor属性,将其设置为所需的UIColor,然后将导航栏色调设置为此属性,当视图关闭时,我释放该属性。这种方法也会导致内存泄漏。这是代码:

    if(self.navigationToolbarColor!=nil){
        [self.navigationToolbarColor release];
    }
    self.navigationToolbarColor=[[[GlobalData sharedGlobalData] returnSelectedNavigationColor] retain];

self.navigationController.navigationBar.tintColor=self.navigationToolbarColor;

任何人都知道问题可能是什么?提前谢谢。

3 个答案:

答案 0 :(得分:1)

这里的问题是您可能将navigationToolbarColor作为保留属性,因此您在这一行上过度保留:

self.navigationToolbarColor=[[[GlobalData sharedGlobalData] returnSelectedNavigationColor] retain];

摆脱对retain的号召,你应该一切都好。

答案 1 :(得分:0)

我通过基本上向UIColor对象添加类别找到了解决方案。这会创建保留在内存中的自定义颜色对象。这样,当我在不同视图中的不同对象中设置我的色调时,我不会再有内存泄漏。如果有人遇到同样的问题,这里有一些示例代码。

这是CustomColors.h文件

#define RGBCOLOR(r,g,b,a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)]

@interface UIColor (CustomColors)

+ (UIColor *)standardColor:(int)selectedAlpha;

@end

这是CustomColors.m文件

#import "CustomColors.h"

@implementation UIColor (CustomColors)

    + (UIColor *)standardColor{
        static UIColor *customColor = nil;

        if (!customColor){
            customColor = RGBCOLOR(135,153,188,1.0);
            [customColor retain];
        }
        return customColor;
    }

然后在我的所有视图中包含#import“CustomColors.h”后,我可以像这样指定颜色:

self.navigationController.navigationBar.tintColor=[UIColor standardColor];

@end

就是这样。现在你可以在没有内存泄漏的情况下享受UIColors。

答案 2 :(得分:0)

静态解决方案绝对不是您想要做的。你用这种方式解决了一个真正问题的假阳性问题。请参阅iphone - UIColor leaking... need to release the object?

的解决方案

只是不要担心“泄漏”,你没事。