2016-02-13 101 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