Ios 当方法调用从viewDidLoad移动时,exc_bad_access code=1

Ios 当方法调用从viewDidLoad移动时,exc_bad_access code=1,ios,objective-c,iphone,xcode,Ios,Objective C,Iphone,Xcode,谢谢你的阅读 我是iOS新手,下面是通过telnet进行通信的聊天应用程序的教程 本教程是一个具有两个视图的单视图控制器:第一个视图用于加入聊天会话,第二个视图用于聊天视图本身。 本教程有点旧,但我能够在最新的XCode 5.1.1上成功地学习 我想做的是创建第二个视图控制器,能够指定IP/主机名,然后连接。 因此,我将调用移动到[self initNetworkCommunication]从viewdiload到按钮,从单独的viewcontroller(它仍然与第一个视图连接到同一个vie

谢谢你的阅读

我是iOS新手,下面是通过telnet进行通信的聊天应用程序的教程

本教程是一个具有两个视图的单视图控制器:第一个视图用于加入聊天会话,第二个视图用于聊天视图本身。 本教程有点旧,但我能够在最新的XCode 5.1.1上成功地学习

我想做的是创建第二个视图控制器,能够指定IP/主机名,然后连接。 因此,我将调用移动到
[self initNetworkCommunication]
viewdiload
到按钮,从单独的viewcontroller(它仍然与第一个视图连接到同一个viewcontroller类)按下按钮

我成功地建立了telnet连接,但一旦我开始发送消息,就会出现exc_bad_access code=1错误。我在第一个视图控制器上创建了一个按钮来执行相同的操作,并且没有遇到任何问题

将其添加到ViewController.m并从viewDidLoad中删除调用

- (IBAction)connectToServer:(id)sender {
    [self initNetworkCommunication];

}
那么,如何避免这个错误呢


*我已将代码放在这里

您可以在“ViewController”类的第二个实例中创建流。因此,在第一个控制器中,输入和输出流不会初始化


您应该为popover创建(例如)另一个控制器,并为主控制器创建委派。点击popover上的“连接”按钮后,您应该从popover控制器向委派发送一些消息([delegate connectToServer]),然后在主控制器中初始化流。

发生的事情是您创建了两个全局变量,这通常不是一个好主意

现在加载主视图,主视图同时控制popover视图控制器。这意味着将实例化同一视图控制器类的两个实例。现在,当您按设置并显示popover时,主视图将被解除分配,因为没有人拥有它的所有权。因此,您可以在中保留对它的强引用
prepareForSegue:
然而,我并不是这样做的

我遵循singleton模式,创建了一个简单的ServerHelper,它保存一个共享的输入输出流。然后我为Connect视图创建了一个简单的控制器,名为
ConnectViewController

您可以在此处下载源代码:

编辑 要实时连接到服务器,请进入
ConnectViewController.m
并添加

[[ServerHelper sharedInstance]连接IP:self.ipAddress.text端口:80];

connectToServer:

在服务器帮助程序中,将以下内容添加到
@接口ServerHelper:NSObject

-(void)connectToIP:(NSString*)IP端口:(int)端口;

用以下内容替换当前的
setStreamDelegate:

- (void)setStreamDelegate:(id<NSStreamDelegate>)streamDelegate {
    _streamDelegate = streamDelegate;
    self.inputStream.delegate = streamDelegate;
    self.outputStream.delegate = streamDelegate;
}

你能把代码贴在你调用的地方吗;
来自另一个视图控制器?@ChrisLoonam已更新。感谢阅读您是否有两个独立的
ViewController
实例?另外,您是使用故事板、XIB还是以编程方式创建视图控制器?我使用的是故事板,上面有两个不同的ViewController。第一个是无标题的,第二个是无标题的led“设置”。正如您在viewDidLoad中看到的,如果([self.title isEqual:@“Settings”]){[self-checkConnection];}只是路人的评论,如果要比较字符串,最好使用isEqualToString:谢谢您的关注。我不再收到错误。我在ServerHelper.m中看到,您连接到服务器。它在启动时就已经连接。我想在连接到服务器之前指定IP地址。如何不连接到服务器启动时启动服务器,并在按下“连接”时启动连接按钮?再次感谢!@ErvinE你按enter键太快了吗?谢谢@chrs!!!工作起来像个冠军。你介意解释一下你原来的
setStreamDelegate
方法和这个方法之间的区别吗?我也试着做同样的事情,把init方法中的代码删除到一个单独的方法中,但是
-(void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)streamEvent
无法捕获事件。我想这与代理的内容有关……再次感谢!
- (void)connectToIP:(NSString *)IP port:(int)port
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStringRef ipRef = (__bridge CFStringRef)IP;
    CFStreamCreatePairWithSocketToHost(NULL, ipRef, port, &readStream, &writeStream);

    self.inputStream = (NSInputStream *)CFBridgingRelease(readStream);
    self.outputStream = (NSOutputStream *)CFBridgingRelease(writeStream);

    self.inputStream.delegate = self.streamDelegate;
    self.outputStream.delegate = self.streamDelegate;

    [_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    [_inputStream open];
    [_outputStream open];
}