【问题标题】:Singleton Manager initWithDelegate单例管理器 initWithDelegate
【发布时间】:2016-05-13 17:11:44
【问题描述】:

我有 2 位经理。一个是另一个的孩子。

Manager1.h

@protocol LoginDelegate <NSObject>

-(id) loginOK: (id) response;
-(id) loginKO: (id) response;

@end

@protocol LogoutDelegate <NSObject>

-(id) logoutOK: (id) response;
-(id) logoutKO: (id) response;

@end

@interface Manager1 : NSObject

- (id) init __attribute__((unavailable("You have to use Manager2 instead.")));
-(id) login;
-(id) logout;

@end

Manager1.m

@interface Manager1 ()

@property (nonatomic, weak) id <LoginDelegate> loginDelegate;
@property (nonatomic, weak) id <LogoutDelegate> logoutDelegate;

@end

@implementation Manager1

- (id)initWithDelegate:(id)aDelegate
{
    self.logoutDelegate = aDelegate;
    self.loginDelegate = aDelegate;

    return self;
}

Manager2.h

@protocol OperationDelegate <NSObject>

-(id) operationOK: (id) response;
-(id) operationKO: (id) response;

@end

@interface Manager2 : Manager1

+ (Manager2 *)sharedInstance;
-(id)init __attribute__((unavailable("You have to use initWithDelegate instead.")));
-(id)initWithDelegate:(id)aDelegate;
-(void)doOperation;

@end

Manager2.m

@interface Manager2 ()

@property (nonatomic, weak) id <OperationDelegate> operationDelegate;

@end

@implementation Manager2

- (id)initWithDelegate:(id)aDelegate
{
    if (self = [super initWithDelegate : aDelegate])
    {
        self.operationDelegate = aDelegate;
    }

    return self;
}

实际上,我可以毫无问题地执行我的方法。 (快速示例):

ViewController.m

let manager2 = Manager2(delegate: self)
manager2.login()
manager2.logout()
manager2.doOperation()

我的代表的回应:

func loginOK(response: id) {

}

func loginKO(response: id) {

}

现在,我想要一个单独的 Manager2。我在 Manager2.m尝试过

static Manager2 *sharedManager = nil;

+ (Manager2 *) sharedManager
    {
        @synchronized(self)
        {
            if (sharedManager == nil)
                sharedManager = [[self alloc] initWithDelegate:self];
        }
        return sharedManager;
}

ViewController1.m 它可以响应。

let manager2 = Manager2(delegate: self)

ViewController2.m 不响应任何内容。代表无效。

let manager2 = Manager2.sharedIntance()

我该怎么做?我必须在 sharedInstance 中发送我的代表?非常感谢

【问题讨论】:

  • sharedManager 是 ?? ,看不到任何声明。是方法还是属性还是实例变量?
  • 我更新了我的问题
  • 我在考虑是否真的有必要。我的想法是不要多次执行 initWithDelegate。
  • 它应该有一个静态变量保存单例,这里没有...
  • :D 查看 Manager1 中的 initWithDelegate 方法,self 未初始化...应该类似于 Manager2 中的 initWithDelegate 方法

标签: swift object delegates singleton


【解决方案1】:

确切地说,您使用Manager1's initWithDelegate 初始化了自我Manager2 的实例

- (id)initWithDelegate:(id)aDelegate{
    if (self = [super initWithDelegate:aDelegate]){
        self.operationDelegate = aDelegate;
    }
    return self;
}

但是Manager1 没有初始化它,应该是这样

- (id)initWithDelegate:(id)aDelegate{
    if (self = [super init]){
        self.logoutDelegate = aDelegate;
        self.loginDelegate = aDelegate;
    }
    return self;
}

【讨论】:

  • 感谢您的帮助。你是对的,但这不会影响
  • 尝试使用 'dispatch_once' 使用基于 GCD 的代码创建单例,如果有帮助的话....也应该是 initWithDelegate:nil in sharedManager
【解决方案2】:

我找到了解决方案:

static Manager2 *sharedInstance = nil;

- (instancetype)init
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = self;
    });

    return sharedInstance;
}

+ (Manager2 *)sharedInstanceWithDelegate: (id)aDelegate
{    
    if (aDelegate != nil)
        [sharedInstance setDelegate:aDelegate];

    return sharedInstance;
}

一个简单的初始化,然后在我获得实例时发送委托。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2012-08-25
    • 2017-08-18
    • 2018-04-28
    相关资源
    最近更新 更多