2012-05-02 3 views
1

私はiOSプログラミングの新機能を持っています。シングルトンクラスが何であるか、そしてなぜそれが使われるのかに非常に興味があります。私はいくつかの情報を見つけましたが、それはあいまいです。特に私はそれを実際の例に適用したいと思います。私のプロジェクトはFacebook SDKを使用していて、友人リストを含むNSDictionaryのシングルトンクラスを作成したいと思っています。私の.mデリゲートファイル:デリゲートクラスを使用する代わりにシングルトンクラスを理解して書く

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
//here is some other code 

facebook = [[Facebook alloc] initWithAppId:@"my app id" andDelegate:self]; 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
if ([defaults objectForKey:@"FBAccessTokenKey"] 
    && [defaults objectForKey:@"FBExpirationDateKey"]) { 
    facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
    facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
} 

if (![facebook isSessionValid]) { 
    NSArray *permissions = [[NSArray alloc] initWithObjects: 
          @"user_location", 
          @"friends_location", 
          @"read_friendlists", 
          nil]; 
    [facebook authorize:permissions]; 
    [permissions release]; 
} 
[facebook requestWithGraphPath:@"me/friends" andDelegate:(id)self]; 

//here is some other code 
} 

そして私は、友人のリストを返す要求の私NSDictionaryの値に設定します。私は、シングルトンクラスを記述する必要があると委譲クラスAppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];を使用していない

- (void)request:(FBRequest *)request didLoad:(id)result { 
_friendsDictionary = result; 
} 

どのようにして、 。

答えて

6

シングルトンは、アプリケーションの実行時に一度だけインスタンス化されるクラスです。彼らはしばしば、マネージャや工場クラスの形をとっています。オブジェクトを常にメモリに保存したいときに使用します。通常、グローバル関数や変数を含むグローバルクラスに使用します。シングルトンパターンを実装するために

最も単純な例では股関節が挨拶発射するの.h

プロジェクト内の任意のクラスでそう
#import <Foundation/Foundation.h> 

@interface MySingleton : NSObject { 

} 
+(MySingleton*)sharedMySingleton; 
-(void)sayHello; 
@end 
.Mで

@implementation MySingleton 
static MySingleton* _sharedMySingleton = nil; 

+(MySingleton*)sharedMySingleton 
{ 
    @synchronized([MySingleton class]) 
    { 
     if (!_sharedMySingleton) 
      [[self alloc] init]; 

     return _sharedMySingleton; 
    } 

    return nil; 
} 


-(void)sayHello { 
    NSLog(@"Hello World!"); 
} 
@end 

でこの

のようなものですこのクラスをインポートしてこのような関数を呼び出すだけでいいです。[MySingleton sharedMySingleton] sayHello];

これは役に立ちます。

+1

また、「FacebookID、UserInfoなど」のようなプロパティを追加して、アプリケーションのさまざまな目的にget/setメソッドをビルドすることもできます。 – Sakares

+0

だから私はデリゲートのように私のシングルトンクラスに同じメソッドを書く必要がありますか? – RomanHouse

+0

として@Jojasは言った..あなたはFacebookのインスタンスとして必要なプロパティを定義し、あなたのシングルトンクラスを介してプロジェクトの任意のクラスにアクセスすることができます..また、シングルトンクラスでは、通常のクラス。 –

3

Singletonsmore singletonsSO PostSingleton in Obj-cがあります。 Googleは最初のページで多分まともな結果を10回投げた。

btwの場合、_friendsDictionaryがivarでありプロパティではないと仮定しても、結果は保持されない場合があります。

2

シングルトンパターンは、iOSコードでは使用しないでください。シングルトンは定義上、メモリリークです。その代わりに、アプリケーションデリゲートから参照される単一のインスタンスを作成する必要があります。シングルトンのようにインスタンスを1つだけ作成できますが、決して解放されない静的(プライベート)変数を作成しないようにしてください。メモリが解放されているかどうかを判断するために、アプリケーションデリゲートからのリファレンスを常にnilに設定することができます。上で説明したシングルトンアプローチでは、これを行うことはできません。

UIView派生要素への参照はクリーンアップされていないため、多くのシステムメモリがリークするため、このインスタンスからの参照データのみに注意してください。

関連する問題