目标 C 单例返回 nil


我有单例使用 websocket 连接,当 _srWebSocket = nil 时,将返回新的_srWebSocket,

但当_srWebSocket连接时,将返回 nil

@interface SocketManager : NSObject
@property (nonatomic, weak) SRWebSocket *srWebSocket;
+ (SocketManager *) sharedInstance;
@end
@implementation SocketManager
@synthesize srWebSocket = _srWebSocket;
+ (SocketManager *) sharedInstance {
    static SocketManager *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[SocketManager alloc] init];
    });
    return sharedInstance;
}
- (id)init {
    if (self = [super init]) {
        NSLog(@"In SocketKeeperSingleton init");
    }
    return self;
}
- (SRWebSocket *) srWebSocket {
    if (!_srWebSocket || _srWebSocket.readyState == SR_CLOSED) {
        _srWebSocket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:@"wss://...:8000"]];
        [_srWebSocket open];
    }
    return _srWebSocket;
}
@end
Call singleton 
srWebSocket = [SocketManager sharedInstance].srWebSocket;

因为你在shareInstance Method 中写了'static SocketManager *sharedInstance = nil;'。当此方法每次发送 nil 时调用 .

 + (SocketManager *) sharedInstance {
static SocketManager *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    sharedInstance = [[SocketManager alloc] init];
});
return sharedInstance;

}

在 shareInstance 方法 "static SocketManager *sharedInstance = nil;">

你缺少srWebSocket方法调用,

第一种方式,

在 singleton.h 文件中声明一个方法

-(void) doInitialSetupOnLaunch;

将此方法添加到 singleton.m 文件中的某个位置,

-(void) doInitialSetupOnLaunch {
   //Put your initialized code i mean you can call your method from here & define your properties here.
 _srWebSocket = [self srWebSocket];
}
- (SRWebSocket *) srWebSocket {
    if (!_srWebSocket || _srWebSocket.readyState == SR_CLOSED) {
        _srWebSocket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:@"wss://...:8000"]];
        [_srWebSocket open];
    }
    return _srWebSocket;
}

从某个地方调用它,您可以从appDelegate.m调用的最佳方式

现在您已准备好按属性访问它,

Call singleton 
srWebSocket = [SocketManager sharedInstance].srWebSocket;

或第二种方式

SRWebSocket * srWebSocket = [[SocketManager sharedInstance] srWebSocket]; 

最新更新