2012-02-20 100 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以上

編輯:看到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可以在一個地方進行更改,並出人意料地影響到另一個對象嘗試使用相同的圖像。上述方法避免了這一點。再次

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

,您:

編輯

在你正在修改的圖像,並使用在幾個地方是修改後的圖像,因爲事實上,我會實現你的getter這樣不想繼續使用相同的圖像,因爲它可能會在一個地方意外修改並影響另一個地方。以上內容會複製圖像並將其返回。

不幸的是,[baseImage_bottomToolbarBG copy]不能正常工作,因爲UIImage不符合NSCopy

+0

這可能是最好的方式,因爲這意味着當它沒有被同時在內存壓力下使用(這UIImage的,使用這種圖像可以得到卸載方法,將照顧)。如果你仍想堅持在一個靜態的,那麼你就需要'-retain'它,這將保持它永遠存在(雖然我相信的UIImage仍然可以卸載的位圖數據,如果它沒有被同時在內存壓力下使用,但不要在這裏引用我)。 – 2012-02-20 20:39:10

+0

我沒有在原來的問題指定,但我實際加載的原始文件,然後收縮並保持縮小圖像的靜態副本。我不希望我的應用每次需要工具欄圖像時都要執行此操作。 – MusiGenesis 2012-02-21 03:31:17

+1

@KevinBallard'UIImage' [記錄在清除低內存情況下的圖像數據](https://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIImage_Class/Reference/Reference.html# // apple_ref/DOC/UID/TP40006890-CH3-SW2)。 – 2012-02-21 04:43:52