我想在objective-c中使用其方法创建一个类,以便访问数据时我不想实例化该类。我怎么能这样做?
答案 0 :(得分:3)
您可以使用singleton
,或者如果您计划仅使用静态方法,则可以将其添加到类中,并直接将其与类名一起使用。
创建方法为static,
+(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等情况。
答案 1 :(得分:2)
您可以使用单身模式,请检查此question。
像这样:
+(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";