2016-02-13 6 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]; 

И я выпускаю его в методе 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 для того, чтобы избежать утечки памяти и сделать это элегантно?

ответ

0

Для NSColor, если у меня есть только ограниченная палитра стандартных цветов, используемых в приложении, я обычно делаю категорию для NSColor и расширяю уже существующий шаблон и т. Д. С моими собственными цветами, как показано ниже.

Это статические синглэты, которые никогда не будут освобождены для жизни приложения. Вместо этого они разделяются. Поскольку они неизменны, нет никакого риска в их обмене. Это не утечка памяти, а только статическая память.

В принципе аналогичный подход должен быть возможен для 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