在名为Utilities的类中,我使用单个静态图像来加载视图中的所有按钮,如下所示:
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
方法
答案 0 :(得分: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 :(得分:1)
我认为更好的方法是不要保留图像的静态副本。相反,创建一个这样的静态方法:
+ (UIImage*)bottomToolbarImagePortrait {
return [UIImage imageNamed:@"bottom-toolbar-background.png"];
}
静态类不需要担心对象的内存管理;调用类需要自己处理。
可以在一个位置更改静态UIImage,并意外地影响尝试使用同一图像的另一个对象。上述方法避免了这种情况。
修改强>
鉴于您正在修改图像并在多个地方使用该修改后的图像,我会像这样实现您的getter:
+ (UIImage*)bottomToolbarImagePortrait {
return [UIImage imageWithCGImage:[baseImage_bottomToolbarBG CGImage]];
}
同样,您不希望继续使用相同的图像,因为它可能会在一个地方意外修改并影响另一个图像。上面会复制图像并将其返回。
不幸的是,[baseImage_bottomToolbarBG copy]
无法正常工作,因为UIImage不符合NSCopy
。