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];

4

3 回答 3

6

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

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

在.h

#import <Foundation/Foundation.h>

@interface MySingleton : NSObject {

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

@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

因此,在您项目中的任何类中触发 tha say hello 函数,您只需要导入该类,然后像这样调用该函数[MySingleton sharedMySingleton] sayHello];

希望这会有所帮助。

于 2012-05-02T07:53:46.800 回答
3

阅读这些:Singletonsmore singletonsSO PostSingleton in Obj-c。谷歌在首页上可能会给出 10 个不错的结果。

顺便说一句,您可能不会保留结果,因为我假设 _friendsDictionary 是 ivar 而不是属性。

于 2012-05-02T07:52:17.030 回答
2

单例模式不应在 iOS 代码中使用。根据定义,单例是内存泄漏。相反,您应该做的是创建一个从应用程序委托引用的单个实例。您可以只创建一个实例,例如单例,但只需确保您不创建永远不会释放的静态(私有)变量。来自应用程序委托的 ref 始终可以设置为 nil 以确定内存是否正在释放。你不能用上面描述的单例方法做到这一点。

注意只引用此实例中的数据,因为对 UIView 派生元素的引用会泄漏大量系统内存,因为它们没有被清理。

于 2012-08-31T06:02:22.287 回答