2012-02-20 6 views
0

В классе с именем утилита, я использую один статическое изображение, чтобы загрузить все кнопки в поле зрения, как это:Должен ли я вернуть статический UIImage или вернуть копию?

static UIImage *baseImage_bottomToolbarBG; 

+ (void) initialize { 
    baseImage_bottomToolbarBG = 
     [UIImage imageNamed:@"bottom-toolbar-background"]; 

    // take bottom-toolbar-background, which is huge, copy it down to size 
    // at which it will actually be used 
} 

+ (void) dealloc { 
    baseImage_bottomToolbarBG = nil; 
} 

+ (UIImage *)getBottomToolbarImagePortrait { 
    return baseImage_bottomToolbarBG; 
} 

..., а затем настроить кнопку с помощью этого фонового изображения, Я называю это:

UIImage *image = [Utilities getBottomToolbarImage]; 
[button setBackgroundImage:image forState:UIControlStateNormal]; 

Является ли это ОК практика, или в моем getBottomToolbarImage я должен сделать копию статической UIImage и вернуть копию?

Это использование ARC и таргетингом IOS 4 +

Edit: см новый комментарий в initialize метод

ответ

2

Лучше всего отправить правильно масштабированное изображение как часть вашего приложения и всегда использовать imageNamed: для его получения, потому что imageNamed: обрабатывает кеширование для вас.

Если вы действительно не хотите это делать по какой-либо причине, то ваш код в порядке. Нет причин создавать дополнительные копии изображения.

Однако объекты класса никогда не уничтожаются, поэтому вам не нужен метод dealloc. На самом деле я хотел бы сделать все это в одном методе, например:

+ (UIImage *)getBottomToolbarImagePortrait { 
    static dispatch_once_t once; 
    static UIImage *image; 
    dispatch_once(&once, ^{ 
     image = [UIImage imageNamed:@"bottom-toolbar-background"]; 
     // Do [image retain] here if not using ARC 
     // image scaling here 
    }); 
    return image; 
} 
1

Я считаю, что лучший способ сделать это было бы не держать статическую копию изображения вокруг. Вместо этого создайте статический метод следующим образом:

+ (UIImage*)bottomToolbarImagePortrait { 
    return [UIImage imageNamed:@"bottom-toolbar-background.png"]; 
} 

Статический класс не должен беспокоиться об управлении памятью для объекта; вызывающему классу нужно будет позаботиться об этом.

Статическое UIImage можно изменить в одном месте и неожиданно воздействовать на другой объект, пытающийся использовать одно и то же изображение. Вышеупомянутый метод позволяет избежать этого.

EDIT

В свете того факта, что вы изменяете изображение и с помощью этого измененного изображения в нескольких местах, я бы реализовать поглотитель, как это:

+ (UIImage*)bottomToolbarImagePortrait { 
    return [UIImage imageWithCGImage:[baseImage_bottomToolbarBG CGImage]]; 
} 

Опять же, не хотят использовать одно и то же изображение, поскольку оно может неожиданно изменяться в одном месте и влиять на другое. Вышеприведенная копия изображения и возвращает его.

К сожалению, [baseImage_bottomToolbarBG copy] не работает так, как хотелось бы, так как UIImage не соответствует NSCopy.

+0

Это, вероятно, самый лучший способ, так как это означает, что изображение может получить выгружен, когда он не используется, находясь под давлением памяти (что UIImage, с помощью этого метод, позаботится). Если вы все еще хотите вставить его в статику, тогда вам нужно «-обеспечить» его, что будет держать его навсегда (хотя я считаю, что UIImage все равно может выгрузить данные растрового изображения, если он не используется при пониженном давлении, но Не цитируйте меня на этом. –

+0

Я не указал в исходном вопросе, но фактически загружаю исходный файл, а затем сжимаю его и сохраняю статическую копию усохшего изображения. Я не хочу, чтобы мое приложение выполняло эту операцию каждый раз, когда мне нужно изображение на панели инструментов. – MusiGenesis

+1

@KevinBallard 'UIImage' [задокументирован, чтобы очистить данные изображения в ситуации с низкой памятью) (https://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIImage_Class/Reference/Reference.html# // apple_ref/DOC/UID/TP40006890-СН3-SW2). –

Смежные вопросы