在类级别声明对象时,会出现问题。iPhone-C

在类级别声明对象时,会出现问题。iPhone-C,iphone,objective-c,class,object,instance-variables,Iphone,Objective C,Class,Object,Instance Variables,iPhone上的目标C: 我正试图在类级别声明以下对象,这样我就不必每次向套接字写入内容时都重新连接它。(每秒多次写入内容)每当我写入稳定的实时数据流时,大约每2秒它就会冻结一次。我不知道为什么,但确实如此 代码: 我尝试在实例数据中声明变量,然后在+initialize和viewdidload中初始化它,但没有成功或出现错误。我已经搜索了几个小时,试图找到一种方法来解决这个问题,在大约20个不同的解决方案之后,我发现没有一个有效。顺便说一下,套接字是objective-c的smallsocke

iPhone上的目标C: 我正试图在类级别声明以下对象,这样我就不必每次向套接字写入内容时都重新连接它。(每秒多次写入内容)每当我写入稳定的实时数据流时,大约每2秒它就会冻结一次。我不知道为什么,但确实如此

代码:

我尝试在实例数据中声明变量,然后在+initialize和viewdidload中初始化它,但没有成功或出现错误。我已经搜索了几个小时,试图找到一种方法来解决这个问题,在大约20个不同的解决方案之后,我发现没有一个有效。顺便说一下,套接字是objective-c的smallsockets包中的一个对象

小插座:

除了每隔几秒钟冻结一次实时数据外,它工作得很好。我已经将部分代码缩小到这两行。我知道创建并连接套接字是导致延迟的原因

任何帮助都是非常非常感谢的

谢谢

[编辑]

以下是我尝试的一些示例代码: 实例声明:

Socket *socket; 
viewDidLoad:

socket = [Socket socket]; //Throws error on compile 
备用视图加载:

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

不要在+initailize中创建socket,这样做太早了

在viewDidLoad中的代码中添加一些调试日志(NSLog()),并记录套接字以查看是否正在创建它。然后在gdb中设置一个断点,看看它是否有效


-W

不要在+initailize中创建套接字,那太早了

在viewDidLoad中的代码中添加一些调试日志(NSLog()),并记录套接字以查看是否正在创建它。然后在gdb中设置一个断点,看看它是否有效

-W

您可能想要使用它,它提供了与套接字的异步操作(在CFSocket和CFStream之上)

我在这里找到了它。

您可能想使用它,它提供了与套接字的异步操作(在CFSocket和CFStream之上)


我在这里找到了。

查看
+socket
的代码会很有趣。我猜这是一种方便的方法,也就是说,这个套接字的结果是自动释放的。现在我不知道您是否在socket属性中保留了这个,但是您应该这样做,否则在runloop完成后,socket就会被释放。i、 你需要一个

@property (retain) Socket *socket; 

在您的界面文件中。

查看
+socket
的代码会很有趣。我猜这是一种方便的方法,也就是说,这个套接字的结果是自动释放的。现在我不知道您是否在socket属性中保留了这个,但是您应该这样做,否则在runloop完成后,socket就会被释放。i、 你需要一个

@property (retain) Socket *socket; 

在您的接口文件中。

那么,如果您的目的地无法到达或其他网络问题导致延迟,会发生什么情况?如果您的远程套接字希望得到某种确认,但您的iPhone在发送ACK时被购买了,该怎么办?如果您没有使用类似select()的机制,那么至少应该在另一个线程中完成所有同步网络工作。NSThread值得一看。

那么,如果您的目的地无法到达或者其他网络问题导致延迟,会发生什么情况?如果您的远程套接字希望得到某种确认,但您的iPhone在发送ACK时被购买了,该怎么办?如果您没有使用类似select()的机制,那么至少应该在另一个线程中完成所有同步网络工作。NSThread值得一看。

是否尝试在类级别声明

您的意思是,您希望“socket”是一个类范围的全局变量,您为整个类而不是实例初始化它吗?如果是这样,就不能将套接字声明为实例变量。实例变量仅存在于实例(即分配的对象)中。相反,您必须在类之外声明它。Globals通常在.m文件的#import行下面声明

然后你可以在任何你想要的地方初始化它。我建议您从ApplicationIDFinishLaunching调用一个类方法:

#import "Socket.h"

Socket *globalSocket = nil;

@implementation Socket

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

....

正在尝试在类级别声明

您的意思是,您希望“socket”是一个类范围的全局变量,您为整个类而不是实例初始化它吗?如果是这样,就不能将套接字声明为实例变量。实例变量仅存在于实例(即分配的对象)中。相反,您必须在类之外声明它。Globals通常在.m文件的#import行下面声明

然后你可以在任何你想要的地方初始化它。我建议您从ApplicationIDFinishLaunching调用一个类方法:

#import "Socket.h"

Socket *globalSocket = nil;

@implementation Socket

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

....

当记录它时,我在实例数据中创建了变量“Socket*Socket”,它工作顺利,直到它尝试以下行:“Socket=[Socket Socket]”我的另一个想法是将它创建为一个单独的对象,然后尝试保存指向实例数据指针的新指针,然而,每当试图写入数据时,它就会崩溃。在原始POST中添加了两次尝试在记录它时,我在实例数据中创建了变量“Socket*Socket”,并且它工作平稳,直到它尝试以下行:“Socket=[Socket Socket]”我的另一个想法是将其创建为一个单独的对象,然后尝试将新指针保存到实例数据指针,但每当数据试图写入时,它就会崩溃。在原始PostThank中添加了两次尝试谢谢,我现在就尝试一下。这是+socket的代码。[CODE]+(Socket*)Socket{return[[[Socket alloc]init]autorelease];}[/CODE]正如我所预料的那样,必须保留[Socket Socket]的返回值,否则它不会持续超过viewDidLoad。我还担心您上面提到的编译器错误,以及为什么它会随更改而消失。当使用方便的方法时,第一次尝试实际上是首选的。什么是编译器错误?(格式化代码的一种方法)