iOS:无法使用Global对象类 - Singleton

时间:2014-05-10 17:58:20

标签: ios objective-c cocoa singleton

在我的项目中,我有一个对象MainAppDataObject,我要在所有其他类之间全局使用。我想在不同的viewControls中保留我需要的其他对象,并且可以轻松访问。我相信,我必须实现Singleton模式。

我尝试在2天内实现,即使用AppDelegate和GlobalObjects,但无法在其他viewController中访问,或者无法设置要保存的对象。

使用GlobalObjects方法: 头文件:

@interface MC_GlobalObjects : NSObject

    +(void) load;
    +(MainAppDataObject*) sharedAppDataObject;

@end

实施档案.m:

#import "MC_GlobalObjects.h"

static MainAppDataObject* _sharedMainAppDataObject = nil;

@implementation MC_GlobalObjects

    +(void) load {
        _sharedMainAppDataObject = [[MainAppDataObject alloc] init];
    }

    +(MainAppDataObject*) sharedAppDataObject {
        return _sharedMainAppDataObject;
    }
@end

在我的LoginViewController.m中:

#import "MC_GlobalObjects.h"

    MainAppDataObject *sharedAppObj = [MC_GlobalObjects sharedAppDataObject];
    sharedAppObj.authLogin = logAgent;

我得到了上面的参考from here,我按照它的说法实现了。我导入MC_GlobalObjects.h,只需调用MC_GlobalObject类的sharedAppDataObject。 MC_GlobalObject obj不会在任何时候初始化,也不会调用它的方法加载。这一行是我第一次从项目的开始使用MC_GlobalObjects对象。 上面代码的结果:创建了sharedAppObj,它的authLogin为nil(如预期的那样)。当我将logAgent分配给authLogin时,会创建authLogin,但其内容仍为零。 logAgent在其中包含值,如full_name,job_title等属性。

任何人都可以帮助我知道,为什么logAgent对象的值不会存储在authLogin中。然后我在ProfileViewController中访问authLogin。

在MainAppDataObject或AgentDetails obj中是否需要更正。 MainAppDataObject.h

@interface MainAppDataObject : AppDataObject
{
    AgentDetails *authLogin;
}
@property (nonatomic, copy) AgentDetails *authLogin;

实施档案:.m

@synthesize authLogin;

AgentDEtails:.h

@interface AgentDetails : NSObject <NSCopying>

    @property (nonatomic, copy) NSString *full_name;
    @property (nonatomic, copy) NSString *job_title;
    @property (nonatomic, copy) NSString *photo;
    @property (nonatomic, copy) NSNumber *agent_id;


    @property (nonatomic, copy) NSString *agentSecret;
@property (nonatomic) bool chatStatus;
    @property (nonatomic) bool onlineStatus;
@property (nonatomic, copy) NSNumber *session;

-(id) initWithNSDictionary: (NSDictionary *)loginInfo;

@end

实施.m:

@synthesize full_name;
@synthesize job_title;

问题出在哪里?任何人都可以帮我理清。我在许多viewControllers和其他对象中访问了很多对象和数据。任何帮助都非常感谢。非常感谢。我还在网站上引用了同一个查询的其他问题,但无法找到我面临的问题的解决方案。我浏览了[here],here 2herehere等。

1 个答案:

答案 0 :(得分:1)

有几件事。首先,没有理由拥有单独的MC_GlobalObjects和MainAppDataObject类。使您的MainAppDataObject对象成为单例。

其次,您不需要,也不应该使用+ load方法。如果对象尚未加载,则使sharedAppDataObject方法延迟加载:

@interface MainAppDataObject: NSObject

@property (nonatomic, strong) NSObject *someObject;
@property (nonatomic, strong) NSObject *someOtherObject;
@property (nonatomic, strong) NSString *someString;

+(MainAppDataObject) sharedAppDataObject;

@end

你的.m文件:

static MainAppDataObject* _sharedAppDataObject = nil;

@implementation

+(MainAppDataObject) sharedAppDataObject;
{
  if (_sharedAppDataObject == nil)
    _sharedAppDataObject = [[MainAppDataObject alloc] init];
  return _sharedAppDataObject;
}

然后在项目的任何类中使用它,首先#import标题,然后使用这样的代码:

[MainAppDataObject sharedAppDataObject].someString = @"Some string";