2012-05-02 25 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的值返回好友列表:

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

在哪種方式我需要編寫單獨的類,並且不使用代理類AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

回答

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實例,並通過你的單例類在你的項目中的任何類訪問它..也可以在單例類中實現Facebook委託方法,就像你在正常班級。 –

2

Singleton模式不應該用在iOS代碼中。根據定義,單例是內存泄漏。你應該做的是創建一個從應用程序委託引用的單個實例。您可以創建一個實例,如單例,但只要確保不創建永不釋放的靜態(私有)變量。從應用程序委託的ref可以始終設置爲零以確定內存是否獲得釋放。你不能用上面描述的單例方法做到這一點。

注意只從這個實例中提取數據,因爲對UIView派生元素的引用會泄漏很多系統內存,因爲它們沒有被清理。

相關問題