在类级别声明对象,问题。 iPhone Objective-C

时间:2009-10-26 08:30:42

标签: iphone objective-c class object instance-variables

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

5 个答案:

答案 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];
    }
}

....