編輯:我實際上追溯到我打電話[打開]的行;並嘗試打開輸入流。出於某種原因,我的自定義類可能是一個無效的代理?我看到其他人有相同的錯誤,並沒有問題後,將所有內容移動到ViewController子類而不是擴展NSObject的自定義類。但是,我仍然想使用我自己的自定義類而不是ViewController之一。iOS5:爲什麼在main.m中setDelegate:self會導致EXC_BAD_ACCESS?
我有一個連接類,我編碼自己,我使用NSInputStream和NSOutputStream。我初始化流在init方法:
- (id)init {
self = [super init];
if(self) {
messages = [NSMutableArray new];
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)HOST, PORT, &readStream, &writeStream);
[self setIn: (__bridge_transfer NSInputStream *)readStream];
[self setOut: (__bridge_transfer NSOutputStream *)writeStream];
NSLog(@"Streams opened.");
NSLog(@"ConnectionController initialized...");
}
return self;
}
而且,這裏是在.H我的連接類的定義
@interface ConnectionController : NSObject <NSStreamDelegate> {
NSMutableArray *messages;
}
@property (strong, nonatomic) NSInputStream *in;
@property (strong, nonatomic) NSOutputStream *out;
-(void)sendMessage:(NSString*)msg;
-(void)stream:(NSStream *)eStream handleEvent:(NSStreamEvent)eventCode;
-(void)messageReceived:(NSString*)msg;
@end
當我把這種方法openStreams,我得到EXC_BAD_ACCESS
- (void)openStreams {
[in setDelegate:self];
[out setDelegate:self];
[in scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[out scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[in open];
[out open];
}
當我註釋掉setDelegate:self時,錯誤不會發生。但是,我需要這個以便使用事件驅動的方法來處理NSStreamEvents 如何解決這個問題?謝謝!
我對這些類不太熟悉,但NSStream(NSInput/Output流繼承自)的文檔說:'委託和setDelegate: 返回並設置委託。默認情況下,流對象必須是它自己的委託;所以一個參數爲nil的setDelegate:消息應該還原這個委託。' – lnafziger 2012-04-21 05:01:28
委託對象是否有可能在該行的某處被釋放和釋放? – Bryan 2012-04-21 22:43:51