我想用它的方法在objective-c中创建一个类,以便访问数据我不想实例化这个类。我该怎么做?
2 回答
您可以使用singleton
,或者如果您打算仅使用静态方法,则可以将其添加到类中并直接与类名一起使用。
创建静态方法,
+(void)method;
然后将其用作,
[MyClass method];
仅当您创建一些仅具有某些实用方法(例如处理图像等)的实用程序类时,这才有用。如果你需要有属性变量,你将需要singleton
.
例如:-
转到新文件并创建MySingleton
将创建MySingleton.h
和MySingleton.m
文件的类。
在 .h 文件中,
@interface MySingleton : NSObject
{
UIViewController *myview;
}
@property (nonatomic, retain) UIViewController *myview;
+(MySingleton *)sharedSingleton;
在 .m 文件中,
+ (MySingleton*)sharedSingleton {
static MySingleton* _one = nil;
@synchronized( self ) {
if( _one == nil ) {
_one = [[ MySingleton alloc ] init ];
}
}
return _one;
}
- (UIViewController *)myview {
if (!myview) {
self.myview = [[[UIViewController alloc] init] autorelease]; //you can skip this, but in that case you need to allocate and initialize the first time you are using this.
}
return myview;
}
然后将其用作,
[[MySingleton sharedSingleton] myview]
项目中的任何位置。不过记得导入MySingleton.h
。同样,您可以在单例中创建任何对象并使用它。只需相应地实现 getter 或 setter 方法。
您必须注意的一件事是,在单例中创建的对象只分配了一个内存空间,因此无论何时在项目中的任何地方使用它都是同一个对象。上面的代码不会myview
在类中创建对象的多个副本。因此,每当您修改其属性时myview
,都会在各处反映出来。仅当绝对需要并且您需要从整个项目中访问单个对象时才使用此方法。通常,我们仅将其用于存储需要从不同类访问的 sessionID 等情况。
你可以使用单例模式,检查这个问题。
像这样:
+(MySingleton *)sharedInstance {
static dispatch_once_t pred;
static MySingleton *shared = nil;
dispatch_once(&pred, ^{
shared = [[MySingleton alloc] init];
shared.someIvar = @"blah";
});
return shared;
}
或者,如果您只想访问方法,则可以使用工厂方法(带有 + 的方法,而不是带有 - 的方法)
@interface MyClass
@property (nonatomic, assign) NSInteger value;
+ (void) factoryMethod;
- (void) instanceMethod;
...
// then in code
[MyClass factoryMethod]; // ok
[[MyClass sharedInstance] instanceMethod]; // ok
[MyClass sharedInstance].value = 5; // ok
更新:
您可以将属性添加到appDelegate
// in your app delegate.h
@property (nonatomic, retain) UIViewController* view;
// in your app delegate.m
@synthesize view;
并appDelegate
从几乎任何地方获取,例如:
myapp_AppDelegate* appDelegate = [[UIApplication sharedApplicaton] delegate];
appDelegate.view = ...; // set that property and use it anywhere like this
请注意,您需要#import
UIViewController 子类和您appDelegate.h
的自动完成功能,有时还需要避免警告。
// someFile.m
#import "appDelegate.h"
#import "myViewController.h"
...
myapp_AppDelegate* appDelegate = [[UIApplication sharedApplicaton] delegate];
appDelegate.view.myLabel.text = @"label text";