我正在尝试实现一个singelton来从一个简单的聊天服务器读/写。我使用singelton模型,以便我可以访问数据并从我的所有viewControllers写入。
我的singelton代码:
#import "ChatDataController.h"
@implementation ChatDataController
{
ChatDataController * anotherSingles;
}
@synthesize enString;
@synthesize enInt;
+(ChatDataController *) singlOjb {
static ChatDataController * single=nil;
@synchronized(self)
{
if(!single)
{
single = [[ChatDataController alloc] init];
}
}
return single;
}
// We can still have a regular init method, that will get called the first time the Singleton is used.
- (id)init
{
self = [super init];
if (self) {
// Work your initialising magic here as you normally would
[self initNetworkCommunication];
}
return self;
}
// Open connection to server
- (void)initNetworkCommunication {
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 8080, &readStream, &writeStream);
inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}
- (void) sendMsg {
NSString *response = [NSString stringWithFormat:@"iam:TestString"];
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];
}
@end
问题在于,当我从[self initNetworkCommunication];
方法运行init
时,我的应用程序因错误而崩溃:(lldb)
在该行检测到中断:
inputStream = (__bridge NSInputStream *)readStream;
任何想法我做错了什么?
编辑:这是我应该这样做的吗?答案 0 :(得分:1)
首先,你的单身代码应该是这样......
+ (ChatDataController *)sharedInstance
{
static dispatch_once_t once;
static ChatDataController *chatDataController;
dispatch_once(&once, ^ { chatDataController = [[ChatDataController alloc] init];});
return chatDataController;
}
接下来,我不确定这是否会解决,因为我不确定确切的问题,但我会这样做...
在AppDelegate中(或者您需要启动流的任何地方)执行此操作...
[[ChatDataController sharedInstance] initNetworkCommunication];
这可以确保在调用实例方法之前完全实例化单例对象。