0

iPhone の Objective C: 何かを書き込むたびにこのソケットを再接続する必要がないように、クラス レベルで次のオブジェクトを宣言しようとしています。(1 秒間に複数回書き込む)ライブ データの安定したストリームを書き込んでいると、約 2 秒ごとにフリーズします。理由はわかりませんが、そうです。

コード:

Socket *socket = [Socket socket];
[socket connectToHostName:@"10.0.2.3" port:1220];

インスタンス データで変数を宣言してから、+initialize と viewdidload で変数を初期化しようとしましたが、成功もエラーもありませんでした。これが機能する方法を見つけるために何時間も検索しましたが、約20の異なるソリューションの後、機能するものは見つかりませんでした. ちなみに、ソケットは、objective-c の smallsockets パックのオブジェクトです。

小さなソケット: http://smallsockets.sourceforge.net/

ライブデータが数秒ごとにフリーズすることを除けば、うまく機能します。コードの一部をこの 2 行に絞り込みました。ソケットを作成してから接続することが遅延の原因であることはわかっています。

どんな助けでも大歓迎です。

ありがとう!!

[編集]

これが私の試みのサンプルコードです: インスタンス宣言:

Socket *socket; 

viewDidLoad:

socket = [Socket socket]; //Throws error on compile 

代替ビューdidload:

Socket *tempSocket = [Socket socket];
socket = tempSocket;
//This compiles fine, however it doesn't work when trying to use it
4

5 に答える 5

2

+initailizeでソケットを作成しないでください。それはかなり早い段階です。

viewDidLoadのコードにデバッグログ(NSLog())を追加し、ソケットをログに記録して、作成されているかどうかを確認します。次に、gdbにブレークポイントを設定し、それが有効かどうかを確認します。

-W

于 2009-10-26T08:41:00.043 に答える
1

のコード+socketを見るのは興味深いでしょう。私の推測では、これは便利なメソッドです。つまり、このソケットの結果は autoReleased です。これをソケットプロパティに保持しているかどうかはわかりませんが、そうしないと、実行ループが完了した後にソケットが解放されます。つまり、

@property (retain) Socket *socket; 

あなたのインターフェースファイルで。

于 2009-10-26T09:20:48.297 に答える
0

(CFSocketおよびCFStreamに加えて)ソケットを使用した非同期操作を提供するAsyncSocketを使用することをお勧めします。

私はこのStackOverflowの回答でそれを見つけました。

于 2009-10-26T08:47:40.243 に答える
0

クラスレベルで宣言しようとしていますか?

「ソケット」を、インスタンスではなく、クラス全体に対して初期化するクラススコープのグローバル変数にしたいということですか? その場合、socket をインスタンス変数として宣言することはできません。インスタンス変数は、インスタンス (つまり、割り当てられたオブジェクト) に対してのみ存在します。代わりに、クラスの外で宣言する必要があります。グローバルは通常、.m ファイルの #import 行のすぐ下で宣言されます。

その後、必要な場所で初期化できます。applicationDidFinishLaunching から呼び出すクラス メソッドをお勧めします。

#import "Socket.h"

Socket *globalSocket = nil;

@implementation Socket

+ (void)connectGlobalSocket
{
    if (!globalSocket)
    {
        globalSocket = [[Socket socket] retain];
        [globalSocket connectToHostName:@"10.0.2.3" port:1220];
    }
}

....
于 2009-10-26T11:54:24.643 に答える
0

宛先に到達できない場合や、他のネットワークの問題によって遅延が発生した場合はどうなるでしょうか? リモート ソケットが何らかの確認応答を期待しているのに、iPhone が ACK を送信するはずの時間に購入している場合はどうでしょうか。select() のようなメカニズムを使用していない場合は、少なくとも同期ネットワークのすべてを別のスレッドで実行する必要があります。NSThread は一見の価値があります。

于 2009-10-26T09:35:56.773 に答える