无需初始化即可访问类

时间:2012-10-27 09:55:54

标签: objective-c ios

我想在objective-c中使用其方法创建一个类,以便访问数据时我不想实例化该类。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

您可以使用singleton,或者如果您计划仅使用静态方法,则可以将其添加到类中,并直接将其与类名一起使用。

创建方法为static,

+(void)method;

然后将其用作,

[MyClass method];

仅当您创建一些仅具有处理图像等实用方法的实用程序类时,这才有用。如果您需要拥有属性变量,则需要singleton

例如: -

转到新文件并创建MySingleton课程,该课程将创建MySingleton.hMySingleton.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";