Мне пришлось разработать приложение, совместимое с 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];
И я выпускаю его в методе dealloc из AppDelegate:
[_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 никогда не выпускается. Nota: Мне нужно использовать эту функцию, потому что с OSX 10.6 SDK я не могу использовать myBlue.CGColor для создания CGColor из NSColor.
Мой второй подход заключается в использовании 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);
И я выпускаю его в методе dealloc из AppDelegate:
CGColorRelease(_myRed);
Когда мне нужно CGColor в другом классе, я достигаю он делает:
appDelegate.myRed
И если мне нужен NSColor, я использую эту функцию:
textView.textColor = [NSColor colorWithCIColor: [CIColor colorWithCGColor: appDelegate.myRed]];
Наконец, вопрос: Что является лучшей практики для управления NSColor и CGColor для того, чтобы избежать утечки памяти и сделать это элегантно?