iPhone上的目标C: 我试图在类级别声明以下对象,以便每次我写入内容时都不必重新连接此套接字。 (每秒写入多次)每当我写一个稳定的实时数据流时,大约每2秒就会冻结一次。我不知道为什么,但确实如此。
代码:
Socket *socket = [Socket socket];
[socket connectToHostName:@"10.0.2.3" port:1220];
我尝试在实例数据中声明变量,然后在+ initialize和viewdidload中初始化它,但没有成功或有错误。我已经搜索了几个小时试图找到一种工作方式,在大约20种不同的解决方案之后,我发现没有一种方法可行。顺便说一句,套接字是来自smallsockets包的object-c的对象。
小插座:http://smallsockets.sourceforge.net/
除了每隔几秒冻结一次实时数据外,它的效果很好。我已将部分代码缩小到这两行。我知道创建然后连接套接字是造成延迟的原因。
非常感谢任何帮助。
谢谢!
[编辑]
以下是我尝试的一些示例代码: 实例声明:
Socket *socket;
viewDidLoad:
socket = [Socket socket]; //Throws error on compile
Alternate Viewdidload:
Socket *tempSocket = [Socket socket];
socket = tempSocket;
//This compiles fine, however it doesn't work when trying to use it
答案 0 :(得分:2)
不要在+ initailize中创建套接字,这是早期的。
将一些调试日志记录(NSLog())添加到viewDidLoad中的代码中,并记录套接字以查看它是否已创建。然后在gdb中放一个断点,看看它是否有效。
-W
答案 1 :(得分:1)
+socket
的代码会很有趣。我的猜测是这是一种方便的方法,即套接字的结果是自动释放的。现在我不知道你是否在你的socket属性中保留了这个,但你应该,否则在runloop完成之后,socket就会被释放。即你需要一个
@property (retain) Socket *socket;
在您的界面文件中。
答案 2 :(得分:0)
您可能希望使用AsyncSocket提供套接字的异步操作(在CFSocket和CFStream之上)。
我在StackOverflow answer中找到了它。
答案 3 :(得分:0)
那么如果你的目的地无法到达或其他一些网络问题导致延迟会怎样?如果你的远程套接字期待某种确认但你的iPhone在它应该发送ACK的时候购买怎么样?如果您没有使用某些类似select()的机制,您至少应该在另一个线程中执行所有同步网络内容。 NSThread值得一看。
答案 4 :(得分:0)
试图在班级宣布?
你的意思是,你希望“socket”是一个类范围的全局变量,你为整个类而不是实例初始化?如果是这样,则不能将socket声明为实例变量。实例变量仅存在于实例(即分配的对象)中。相反,您必须在课堂外声明它。 Globals通常在.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];
}
}
....