整个应用程序中的静态UIImage

时间:2011-11-30 13:06:20

标签: iphone objective-c ios static uiimage

我想要一个静态的UIImage,所以我可以从不同的类中访问它。我已经尝试过这种方式,但没有成功:

Constans.h 文件改为:

static UIImage *myImage;

之后我将这个标题导入其中。我认为此时 myImage 是静态的,对此对象所做的任何更改都会在任何地方都可见。但看起来每个班级都在研究自己的 myImage 实例。有没有办法有这样的静态UIImage?


修改

AppDelegate中的属性工作正常。我现在有静态的UIImage,但我仍然没有效果。

我在ViewController中有一个UIImageView。我将图像加载到我的 delegate.myImage 并在我执行之后:

delegate.myImage = [UIImage imageNamed:@"blah.png"];
myImageView.image = delegate.myImage;

图像已加载,但是我想在AppDelegate中更改它,但是当我以这种方式更改 myImage 时:

delegate.myImage = [UIImage imageNamed:@"blah2.png"];

myImageView 中没有任何变化。它就像 myImageView.image = delegate.myImage 复制了 myImage 的内存地址所以如果我改变了 myImage 的引用它&#39 ; s不影响 myImageView.image 。我希望有一个UIImage,在任何更改后它也会影响 myImageView

除了在AppDelegate中引用 myImageView 之外还有其他方法吗?

7 个答案:

答案 0 :(得分:4)

只需使用[UIImage imageNamed:],而不是制作明确的应用程序范围的图像。这会为您处理图像的缓存!无论您需要使用图像,只需像以下一样访问它:

[UIImage imageNamed:@"imageName.png"]

注意:这将导致在内存中存在单个图像副本。你无法卸载它 - 但是在较低的内存条件下,较新版本的iOS可能会在幕后卸载它。

另请参阅[UIImage imageNamed:]的API文档。

顺便说一句,imageNamed通常用于多次使用的小图像 - 例如表格单元格图像 - 但如果您真的想要静态应用程序范围的图像,则没有理由不在大图像上使用它。

答案 1 :(得分:3)

关键字static为其定义的编译单元创建一个本地变量。这意味着您可以安全地在多个.c文件中定义相同的符号;所有这些声明都不会发生冲突,每个文件都有自己的私有符号。

简单地说,如果您真的想要定义程序任何部分访问的全局变量,则不需要static关键字。但是,在这种情况下,“技巧”是在头文件中声明变量(包括全局应该可见的所有地方),如下所示:

 extern UIImage *myImage;

然后在没有static关键字的单个位置(.c文件)中提供该变量的定义。 extern关键字告诉编译器在当前编译单元(.c文件)中找不到该符号的定义,但在另一个编译单元中找不到。

现在,正如许多其他人所指出的那样,你可以通过单身人士更好地做到这一点,尽管通常认为使用singleton to mask a global variable is usually a way to mask a design problem

答案 2 :(得分:1)

这是一个C问题(与Objective-C或iOS无关)

static关键字使变量在其编译单元内变为粘性。

当您#include(或ObjC中的#import)标题时,就像其内容被复制一样。粘贴到包含它的文件中。提醒一下,“。h”文件没有编译(它们只包含在自己编译的“.m”文件中)

这样的工作方式与您在.h中的#include任何文件中输入相同代码行的方式完全相同。

这解释了为什么在#include "Constants.h"的每个源文件中,每个源文件都会看到myImage变量的不同实例。


相反,你应该:

  • 使用Singleton模式,专门为此类案例制作
  • 或者在实现文件(“Constants.m”)中使用static关键字使此变量在此“Constants.m”文件的编译单元内粘贴

我强烈建议单独使用Singleton Pattern来处理此类案例More info on Singleton Pattern here in the Apple official DevPedia

答案 3 :(得分:1)

您可以在app委托中创建@property (nonatomic, retain) UIImage *image;,并在每个要使用的图像中创建AppDelegate *delegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];,然后从delegate对象访问UIImage :

[imageView setImage:[delegate image]];

或者您可以使用这样的类:

头文件

@interface Data : NSObject

@property (nonatomic, strong) UIImage *image;

+ (Data *)sharedInstance;
+ (id)allocWithZone:(NSZone*)zone;
- (id)init;
- (id)copyWithZone:(NSZone *)zone;

@end

实施档案

@implementation Data

@synthesize image;

static Data *sharedInstance=nil;

+ (Data *)sharedInstance {

    if (sharedInstance == nil) {
        sharedInstance = [[super allocWithZone:NULL] init];
    }

    return sharedInstance;
}

+ (id)allocWithZone:(NSZone*)zone {
    return [self sharedInstance];
}

- (id)init
{
    self = [super init];

    if (self) {

    }
    return self;
}

- (id)copyWithZone:(NSZone *)zone {
    return self;
}

@end

然后,您必须在所需的每个课程中导入Data.h,然后使用:

UIImageView *imageView=[[UIImageView alloc] init];
[imageView setImage:[[Data sharedInstance] image]];

这对我很有用:))

答案 4 :(得分:0)

使用单例模式。

如果您的代码是ARC,请点击此链接http://lukeredpath.co.uk/blog/a-note-on-objective-c-singletons.html

答案 5 :(得分:0)

在iPhone中,AppDelegate类使用静态类。所以你可以在 YourAppDelegate 类的 Constant.h 中做同样的事情。但是不要使用静态关键字。

我不是很确定,但认为它会起作用。 :)

答案 6 :(得分:0)

您可以使用UIImage类别作为示例来获取此图片。

在.h文件中,只需添加静态方法。

#import <UIKit/UIKit.h>

@interface UIImage (StaticImage)

+(UIImage *)staticImage;

@end

在.m文件中执行以下步骤:

#import "UIImage+StaticImage.h"

//This is your static image
static UIImage *myStaticImage;

@implementation UIImage (StaticImage)

+(void)initialize{
   //Important to add this condition, because this method will be called for every 
   //child class of UIImage class
    if (self == [UIImage class]){
        myStaticImage = [[UIImage alloc] init];
    }
}

+(UIImage *)staticImage{
    //Just return your existing static image
    return myStaticImage;
}

@end