0

ソケットからのリクエストをリッスンするには、バックグラウンドで追加のスレッドが必要です。

コードはシングルトン クラスに配置されます。次のように NSApplicationMain() の前に main.m で呼び出されます。

 [[SKSocketThread getSingleton] runThread];

また、runThread は次のように定義されます。

- (void) runThread {
    [NSThread detachNewThreadSelector:@selector(socketThreadMainLoop:)
                             toTarget:self
                           withObject:[self quitLock]];
}

- (void) socketThreadMainLoop:(id)param {
    NSLock *lock = (NSLock *)param;
    while (![lock tryLock]) {
        NSLog(@"Yay! We are in socketThreadMainLoop now!");
        [NSThread sleepForTimeInterval:2];
    }
    NSLog(@"Terminating the socket thread...");
    [lock unlock]; // is it really necessary?
}

警告なしで正常にコンパイルされますが、実行時にエラーがスローされます。

autoreleased with no pool in place.

私はいくつかのグーグルを行い、@autoreleasepool を使用して runThread と socketThreadMainLoop にコードをパックしようとしましたが、エラーはまだ残っています。最後に、runThread への呼び出しを main.m でラップしたところ、うまくいきました。

なぜこの方法でしか機能しないのかわかりません...

4

2 に答える 2

0

ブレークポイントを設定しobjc_autoreleaseNoPool、バックトレースを送信します。メイン スレッドを含む、ループを実行しないすべてのスレッドで @autoreleasepool{...} が必要です (NSApplicationMain() を呼び出していない場合は、main.m で)。

いくつかの追加フィードバック; メソッドに名前を付けたというgetSingletonことは、iOS 開発の初心者であることを示しています (メソッドに名前を付けないでくださいget*)。ループで使用sleepしているwhileということは、ネットワーク全体にも少し慣れていないことを示しています。

また、呼び出しの前にスレッドをスピンアップすることNSApplicationMain()は、まったく間違ったことです。アプリケーションの起動の通常の部分としてネットワーク グープを実行する必要があります...以下を参照してください。

スリープ状態でハンドロールされた while() ループを使用してネットワーキングを行いたくありませ 。ポーリングは、モバイル デバイスではひどいパターンです。それはバッテリーを消費し、それは物事を無反応にするだけです.sleep

適切な実行ループおよび/またはディスパッチ ソースおよび/または CFStream API および/または NSFileHandles を使用します。

于 2012-10-19T20:58:24.827 に答える
0

@autoreleasepoolコードをブロックでラップする必要があります。

...
- (void) socketThreadMainLoop:(id)param {
@autoreleasepool
{    
    NSLock *lock = (NSLock *)param;
    while (![lock tryLock]) {
        NSLog(@"Yay! We are in socketThreadMainLoop now!");
        [NSThread sleepForTimeInterval:2];
    }
    NSLog(@"Terminating the socket thread...");
    [lock unlock]; // is it really necessary?
}
}

詳細: NSAutoreleasePool クラス リファレンス

于 2012-10-19T20:44:05.150 に答える