【问题标题】:UIColor Memory Leak IssueUIColor 内存泄漏问题
【发布时间】:2011-05-04 22:48:26
【问题描述】:

我一直在尝试解决这个问题。基本上我使用方便的 RGB UIColor 函数返回一个 UIColor 来为我的 UINavigationBar、UIToolbar 和其他对象着色。但是由于某种原因,在 Instruments 中,每次加载 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;

有人知道问题可能是什么吗?提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    摆脱对retain 的呼叫,你应该一切都好。

    【讨论】:

    • 感谢您的回复。但是我试过了,但是我仍然得到相同的内存泄漏。我使用的第一种方法没有保留(没有属性)并且会导致内存泄漏。我尝试按照您的建议使用没有保留的属性,这也会导致内存泄漏。我刚刚想到了什么,会不会是因为我的函数在单例对象中?
    • 不,不是这样。我尝试直接执行此操作而不是调用函数,但仍然出现内存泄漏: self.navigationToolbarColor= [UIColor colorWithRed:(39)/255.0 green:(64)/255.0 blue:(139)/255.0 alpha:(1.0)] ;将 UIColor 分配给导航控制器的色调后,是否应该在某处释放它?我不认为这是必要的,因为它应该是一个自动释放的对象。任何线索或想法都会有所帮助。
    【解决方案2】:

    我基本上通过向 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];
    

    @结束

    就是这样。现在您可以享受 UIColors 而不会出现内存泄漏。

    【讨论】:

    • 强烈建议不要使用此解决方案。看回答我的回答。
    【解决方案3】:

    静态解决方案绝对不是您想要做的。您正在以这种方式解决真正问题的误报问题。解决方法见iphone - UIColor leaking... need to release the object?

    不用担心“泄漏”,你就没事了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多