使用NSColor和CGColor管理内存的最佳方法

时间:2016-02-13 23:14:26

标签: macos cocoa memory-leaks nscolor cgcolor

我必须开发一个兼容OSX 10.6的应用程序到最新版本,这需要手动管理内存。在这个应用程序中,我希望将所有颜色放在一个位置,并通过appDelegate的属性访问它。

我的第一种方法是使用NSColor对象:

@property (strong, nonatomic) NSColor *myBlue;

@synthesize myBlue = _myBlue;   

_myBlue = [[NSColor colorWithCalibratedRed:20.0/255.0 green:20.0/255.0 blue:0.0/255.0 alpha:1.0/1.0] retain];

我在appDelegate的dealloc方法中发布它:

[_myBlue release];

当我在另一个类中需要NSColor时,我访问它:

appDelegate.myBlue

如果我需要CGColor,我使用了这个功能:

- (CGColorRef)NSColorToCGColor:(NSColor *)color
{
    NSInteger numberOfComponents = [color numberOfComponents];
    CGFloat components[numberOfComponents];
    CGColorSpaceRef colorSpace = [[color colorSpace] CGColorSpace];
    [color getComponents:(CGFloat *)&components];
    CGColorRef cgColor = CGColorCreate(colorSpace, components);

    return cgColor;
}

view.layer.backgroundColor = [[GlobalFunctions sharedGlobalFunctions]  NSColorToCGColor:appDelegate.myBlue]];

但是已知此函数会导致内存泄漏,因为对象cgColor永远不会释放。注意:我需要使用此功能,因为使用OSX 10.6 SDK,我无法使用myBlue.CGColor从NSColor生成CGColor。

我的第二种方法是像这样使用CGColor:

@property (nonatomic) struct CGColor *myRed;

@synthesize myRed = _myRed;

_myRed = CGColorCreateGenericRGB(20.0/255.0, 20.0/255.0, 255.0/255.0, 1.0/1.0);

我在appDelegate的dealloc方法中发布它:

CGColorRelease(_myRed);

当我需要另一个类中的CGColor时,我访问它:

appDelegate.myRed

如果我需要NSColor,我会使用此功能:

textView.textColor = [NSColor colorWithCIColor: [CIColor colorWithCGColor: appDelegate.myRed]];

最后,问题是:管理NSColor和CGColor的最佳做法是什么,以避免内存泄漏并优雅地进行操作?

1 个答案:

答案 0 :(得分:0)

对于NSColor,如果我只有应用程序使用的有限标准颜色调色板,我通常会为NSColor创建一个类别,并扩展已存在的[NSColor blackColor]等模式。用我自己的颜色如下。

这些是静态单例,在应用程序生命周期内永远不会被释放。相反,他们是共享的。因为它们是不可变的,所以没有共享它们的风险。这不是内存泄漏,只是静态内存开销。

原则上,CGColor应该可以采用类似的方法,问题是我认为没有可扩展的类,所以只需使用适当的函数创建一个返回CGColor结构的新源文件。

NSColor + CustomColors.h

#import <Cocoa/Cocoa.h>

@interface NSColor (CustomColors)

+(NSColor *)pinkColor;
+(NSColor *)darkGreenColor;

@end

NSColor + CustomColors.m

#import "NSColor+CustomColors.h"

@implementation NSColor (CustomColors)

+(NSColor *)pinkColor{

    static NSColor *pinkColor;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        pinkColor = [NSColor colorWithSRGBRed:247.0 / 255.0 green:234.0 / 255.0 blue:228.0 /255.0  alpha:1.0];
});
    return pinkColor;
    }

+(NSColor *)darkGreenColor{

    static NSColor *darkGreenColor;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
         darkGreenColor = [NSColor colorWithSRGBRed:0.0 green:132.0 / 255.0 blue:0.0  alpha:1.0];
});
    return darkGreenColor;
}

@end