在 Objective-C 类别中初始化静态变量

发布于 2024-08-17 16:43:41 字数 960 浏览 2 评论 0原文

我试图创建一个静态变量来存储图像字典。不幸的是,我能找到的初始化它的最好方法是检查使用该变量的每个函数。由于我是在类别内创建此变量,因此我不能仅在初始化程序内初始化它。有没有更简洁的方法来初始化 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

扎心 2024-08-24 16:43:41
__attribute__((constructor))
static void initialize_navigationBarImages() {
  navigationBarImages = [[NSMutableDictionary alloc] init];
}

__attribute__((destructor))
static void destroy_navigationBarImages() {
  [navigationBarImages release];
}

这些函数将在程序启动和结束时自动调用。

__attribute__((constructor))
static void initialize_navigationBarImages() {
  navigationBarImages = [[NSMutableDictionary alloc] init];
}

__attribute__((destructor))
static void destroy_navigationBarImages() {
  [navigationBarImages release];
}

These function will be called automatically when the program starts and ends.

海未深 2024-08-24 16:43:41

考虑这种方法,

static NSMutableDictionary *navigationBarImages()
{
    static NSMutableDictionary *dict = NULL;
    if(dict == NULL)
    {
        dict = [[NSMutableDictionary alloc] init];
    }
    return [[dict retain] autorelease];
}

然后每当您要使用 navigationBarImages 时,将其替换为 navigationBarImages(),如下所示:

更改

NSString *imageName=[navigationBarImages objectForKey:self];

NSString *imageName=[navigationBarImages() objectForKey:self];

如果函数调用开销困扰您,也许可以使用临时变量捕获navigationBarImages()的返回,

NSMutableDictionary *dict = navigationBarImages();
[dict doSomething];
[dict doSomething];

缺点是一旦你调用navigationBarImages(),NSMutableDictionary的实例被创建,那么它永远不会有机会释放,直到程序结束。

Consider this approach,

static NSMutableDictionary *navigationBarImages()
{
    static NSMutableDictionary *dict = NULL;
    if(dict == NULL)
    {
        dict = [[NSMutableDictionary alloc] init];
    }
    return [[dict retain] autorelease];
}

then whenever you woulde use navigationBarImages, replace it with navigationBarImages(), like this:

change

NSString *imageName=[navigationBarImages objectForKey:self];

to

NSString *imageName=[navigationBarImages() objectForKey:self];

If the function call overhead bothers you, maybe use a temporary variable to catch the return of navigationBarImages(),

NSMutableDictionary *dict = navigationBarImages();
[dict doSomething];
[dict doSomething];

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.

最偏执的依靠 2024-08-24 16:43:41

您所需要的只是在使用之前在已知点设置静态一次。例如,您可以设置 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:

っ〆星空下的拥抱 2024-08-24 16:43:41

一种选择是使用 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].

究竟谁懂我的在乎 2024-08-24 16:43:41

您可以添加 +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.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文