我想要一个静态的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 之外还有其他方法吗?
答案 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 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