在 Objective-C 类别中初始化静态变量
我试图创建一个静态变量来存储图像字典。不幸的是,我能找到的初始化它的最好方法是检查使用该变量的每个函数。由于我是在类别内创建此变量,因此我不能仅在初始化程序内初始化它。有没有更简洁的方法来初始化 navigationBarImages?
static NSMutableDictionary *navigationBarImages = NULL;
@implementation UINavigationBar(CustomImage)
//Overrider to draw a custom image
- (void)drawRect:(CGRect)rect
{
if(navigationBarImages==NULL){
navigationBarImages=[[NSMutableDictionary alloc] init];
}
NSString *imageName=[navigationBarImages objectForKey:self];
if (imageName==nil) {
imageName=@"header_bg.png";
}
UIImage *image = [UIImage imageNamed: imageName];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
//Allow the setting of an image for the navigation bar
- (void)setImage:(UIImage*)image
{
if(navigationBarImages==NULL){
navigationBarImages=[[NSMutableDictionary alloc] init];
}
[navigationBarImages setObject:image forKey:self];
}
@end
I was trying to create a static variable to store a dictionary of images. Unfortunately, the best way I could find to initialise it was to check in each function that used the variable. Since I am creating this variable inside a category, I can't just initialise it inside the initialiser. Is there a neater way of initialising navigationBarImages?
static NSMutableDictionary *navigationBarImages = NULL;
@implementation UINavigationBar(CustomImage)
//Overrider to draw a custom image
- (void)drawRect:(CGRect)rect
{
if(navigationBarImages==NULL){
navigationBarImages=[[NSMutableDictionary alloc] init];
}
NSString *imageName=[navigationBarImages objectForKey:self];
if (imageName==nil) {
imageName=@"header_bg.png";
}
UIImage *image = [UIImage imageNamed: imageName];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
//Allow the setting of an image for the navigation bar
- (void)setImage:(UIImage*)image
{
if(navigationBarImages==NULL){
navigationBarImages=[[NSMutableDictionary alloc] init];
}
[navigationBarImages setObject:image forKey:self];
}
@end
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这些函数将在程序启动和结束时自动调用。
These function will be called automatically when the program starts and ends.
考虑这种方法,
然后每当您要使用 navigationBarImages 时,将其替换为 navigationBarImages(),如下所示:
更改
为
如果函数调用开销困扰您,也许可以使用临时变量捕获navigationBarImages()的返回,
缺点是一旦你调用navigationBarImages(),NSMutableDictionary的实例被创建,那么它永远不会有机会释放,直到程序结束。
Consider this approach,
then whenever you woulde use navigationBarImages, replace it with navigationBarImages(), like this:
change
to
If the function call overhead bothers you, maybe use a temporary variable to catch the return of navigationBarImages(),
The drawback is once you called navigationBarImages(), the instance of NSMutableDictionary got created, then it'll never get chance to dealloc until the end of the program.
您所需要的只是在使用之前在已知点设置静态一次。例如,您可以设置 NSApplication 委托并让它在
-applicationDidFinishLaunching:
中完成工作All you need is to set your static once at a known point before it is used. For example, you can set an NSApplication delegate and have it do the work in
-applicationDidFinishLaunching:
一种选择是使用 C++。将文件扩展名更改为 .mm 并将
= NULL
替换为[[NSMutableDictionary alloc] init]
。One option is to use C++. Change the file's extension to .mm and replace
= NULL
with[[NSMutableDictionary alloc] init]
.您可以添加
+initialize
- 您只需要确保您没有破坏现有的实现,或者您'会变得古怪。 (显然,如果您编写代码,则可以确定这一点,但对于第三方代码,这可能不是最好的方法。)You could add
+initialize
in the .m file of your category — you'll just need to make sure you're not smashing an existing implementation or you'll get general wonkiness. (Obviously, you can be sure of this if you wrote the code, but with third-party code, this is probably not the best approach.)