0

シンプルなチャットサーバーから読み書きするシングルトンを実装しようとしています。データにアクセスし、すべてのviewControllerから書き込むことができるように、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;

私が間違っていることは何ですか?

編集:これは私がやるべき方法ですか?

4

1 に答える 1

1

まず、シングルトン コードは次のようになります...

+ (ChatDataController *)sharedInstance
{
    static dispatch_once_t once;
    static ChatDataController *chatDataController;
    dispatch_once(&once, ^ { chatDataController = [[ChatDataController alloc] init];});
    return chatDataController;
}

次に、正確な問題がわからないため、これが修正されるかどうかはわかりませんが、この方法で行います...

AppDelegate (またはストリームを開始する必要がある場所) でこれを行います...

[[ChatDataController sharedInstance] initNetworkCommunication];

これにより、インスタンス メソッドを呼び出す前に、シングルトン オブジェクトが完全にインスタンス化されます。

于 2013-08-01T08:13:58.413 に答える