我不得不开发一个兼容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的最佳实践,以避免内存泄漏并优雅地执行它?