理解和编写单例类而不是使用委托类

Rom*_*use 1 singleton facebook objective-c ios

我是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
}
Run Code Online (Sandbox Code Playgroud)

我设置了我的NSDictionary值请求返回朋友列表:

- (void)request:(FBRequest *)request didLoad:(id)result {
_friendsDictionary = result;
}
Run Code Online (Sandbox Code Playgroud)

我需要以哪种方式编写单例类,不要使用委托类AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];.

Mal*_*ndi 6

单例是一个只在应用程序的运行时实例化一次的类.它们通常采用管理器或工厂类的形式.当你想让对象永远存在于内存中时,它们会被使用.通常我用于包含全局函数和变量的全局类,我需要在我的应用程序的许多地方.

实现单例模式的最简单示例是这样的

在.h

#import <Foundation/Foundation.h>

@interface MySingleton : NSObject {

}
+(MySingleton*)sharedMySingleton;
-(void)sayHello;
@end
Run Code Online (Sandbox Code Playgroud)

在.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
Run Code Online (Sandbox Code Playgroud)

因此,在你的项目的任何类中,你只需要导入这个类,然后调用这个函数 [MySingleton sharedMySingleton] sayHello];

希望这会有所帮助.