そのメソッドを使用して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メソッドを実装するだけです。
注意しなければならないことの1つは、シングルトンで作成されたオブジェクトには1つのメモリスペースしか割り当てられていないため、プロジェクトのどこででも使用している場合は常に同じオブジェクトであるということです。上記のコードは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";