我必须开发一个兼容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的最佳做法是什么,以避免内存泄漏并优雅地进行操作?
答案 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