2016-02-13 68 views
0

我不得不开发一个兼容OSX 10.6到最新版本的应用程序,这需要手动管理内存。在这个应用程序中,我想将所有的颜色都放在一个地方,并通过appDelegate的属性访问它。使用NSColor和CGColor管理内存的最佳方法

我的第一个方法是使用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的最佳实践,以避免内存泄漏并优雅地执行它?

回答

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 
相关问题