目标c - UIColor内存泄漏问题



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

- (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;

有谁知道是什么问题吗?

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

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

去掉对retain的呼叫,你应该就没事了。

我通过向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了。

静态解决方案绝对不是您想要做的。你是在用真正的问题解决假阳性问题。看到解决iphone - UIColor泄漏…需要释放对象吗?

只要不用担心"泄漏",你就没事了。

最新更新