Ios 当方法调用从viewDidLoad移动时,exc_bad_access code=1
谢谢你的阅读 我是iOS新手,下面是通过telnet进行通信的聊天应用程序的教程 本教程是一个具有两个视图的单视图控制器:第一个视图用于加入聊天会话,第二个视图用于聊天视图本身。 本教程有点旧,但我能够在最新的XCode 5.1.1上成功地学习 我想做的是创建第二个视图控制器,能够指定IP/主机名,然后连接。 因此,我将调用移动到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
[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];
}