2012-02-20 98 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