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

Objective c 理解和编写单例类而不是使用委托类,objective-c,ios,facebook,singleton,Objective C,Ios,Facebook,Singleton,我是iOS编程新手,我对什么是singleton类以及为什么使用它非常感兴趣。我找到了一些信息,但很模糊。我特别想把它应用到实际例子中。我的项目使用FacebookSDK,我想为包含好友列表的NSDictionary创建singleton类。My.m委托文件: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //here i

我是iOS编程新手,我对什么是singleton类以及为什么使用它非常感兴趣。我找到了一些信息,但很模糊。我特别想把它应用到实际例子中。我的项目使用FacebookSDK,我想为包含好友列表的NSDictionary创建singleton类。My.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]

请阅读以下内容:。谷歌在第一页上提供了10个不错的结果

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

请阅读以下内容:。谷歌在第一页上提供了10个不错的结果


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

Singleton是一个在应用程序运行时只实例化一次的类。他们通常采取经理或工厂课程的形式。。当你想让对象一直存在于内存中时,它们就被使用了,通常我用于全局类,它包含我在应用程序的许多地方需要的全局函数和变量

实现单例模式的最简单示例如下

in.h

因此,在项目中的任何类中,如果要启动sayHello函数,只需导入该类,然后像这样调用函数
[MySingleton sharedMySingleton]sayHello]


希望这会有所帮助。

Singleton是一个在应用程序运行时只实例化一次的类。他们通常采取经理或工厂课程的形式。。当你想让对象一直存在于内存中时,它们就被使用了,通常我用于全局类,它包含我在应用程序的许多地方需要的全局函数和变量

实现单例模式的最简单示例如下

in.h

因此,在项目中的任何类中,如果要启动sayHello函数,只需导入该类,然后像这样调用函数
[MySingleton sharedMySingleton]sayHello]


希望这会有所帮助。

iOS代码中不应使用单例模式。根据定义,单例是内存泄漏。您应该做的是创建一个从应用程序委托引用的实例。您可以只创建一个实例,就像一个单例一样,但只需确保您不会创建一个从未发布过的静态(私有)变量。应用程序委托的ref始终可以设置为nil,以确定内存是否被释放。使用上面描述的单例方法无法做到这一点


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

单例模式不应在iOS代码中使用。根据定义,单例是内存泄漏。您应该做的是创建一个从应用程序委托引用的实例。您可以只创建一个实例,就像一个单例一样,但只需确保您不会创建一个从未发布过的静态(私有)变量。应用程序委托的ref始终可以设置为nil,以确定内存是否被释放。使用上面描述的单例方法无法做到这一点


请注意仅引用此实例中的数据,因为对UIView派生元素的引用将泄漏大量系统内存,因为这些元素未被清理。

您还可以添加诸如“FacebookID、UserInfo等”之类的属性,并在应用程序中为多个目的构建get/set方法!所以我需要在我的单例类中编写与delegate中相同的方法,正如@Jojas所说。。您可以将任何想要的属性定义为facebook实例,并通过singleton类在项目中的任何类中访问它。。你也可以在singleton类中实现Facebook委托方法,就像在普通类中一样。@Malek_Jundi但是如果我实现Facebook委托方法并且下一步将使用它,它是否与我将使用just delegate方法相同?不,你将把工具从app委托移动到你的singleton类中。。因此,您将不再使用应用程序委托。您还可以在应用程序中添加诸如“FacebookID、UserInfo等”的属性,并构建get/set方法以实现多种用途!所以我需要在我的单例类中编写与delegate中相同的方法,正如@Jojas所说。。您可以将任何想要的属性定义为facebook实例,并通过singleton类在项目中的任何类中访问它。。你也可以在singleton类中实现Facebook委托方法,就像在普通类中一样。@Malek_Jundi但是如果我实现Facebook委托方法并且下一步将使用它,它是否与我将使用just delegate方法相同?不,你将把工具从app委托移动到你的singleton类中。。因此,您将不再使用应用程序代理。
#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