我是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];
。
答案 0 :(得分:6)
单例是一个只在应用程序的运行时实例化一次的类。它们通常采用管理器或工厂类的形式。当你想让对象永远存在于内存中时,它们会被使用。通常我用于包含我应用程序中许多地方所需的全局函数和变量的全局类。 / p>
实现单例模式的最简单示例是这样的
in .h
#import <Foundation/Foundation.h>
@interface MySingleton : NSObject {
}
+(MySingleton*)sharedMySingleton;
-(void)sayHello;
@end
in .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 :(得分:3)
请阅读以下内容:Singletons,more singletons,SO Post,Singleton in Obj-c。谷歌在第一页上可能会得到10个不错的结果。
顺便说一句,你可能不会保留结果因为我假设_friendsDictionary是一个ivar而不是属性。答案 2 :(得分:2)
不应在iOS代码中使用Singleton模式。根据定义,单例是内存泄漏。你应该做的是创建一个从app delegate引用的单个实例。您可以只创建一个实例,如单例,但只需确保不创建永不释放的静态(私有)变量。应用程序委托的引用始终可以设置为nil,以确定是否已释放内存。你不能用上面描述的单身方法做到这一点。
请注意仅从此实例中引用数据,因为对UIView派生元素的引用会泄漏大量系统内存,因为它们未被清除。