2012-04-21 96 views
1

編輯:我實際上追溯到我打電話[打開]的行;並嘗試打開輸入流。出於某種原因,我的自定義類可能是一個無效的代理?我看到其他人有相同的錯誤,並沒有問題後,將所有內容移動到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 如何解決這個問題?謝謝!

+0

我對這些類不太熟悉,但NSStream(NSInput/Output流繼承自)的文檔說:'委託和setDelegate: 返回並設置委託。默認情況下,流對象必須是它自己的委託;所以一個參數爲nil的setDelegate:消息應該還原這個委託。' – lnafziger 2012-04-21 05:01:28

+0

委託對象是否有可能在該行的某處被釋放和釋放? – Bryan 2012-04-21 22:43:51

回答

0

發生什麼事是因爲你沒有保留它,或者你正在使用ARC(漂亮的),所以正在釋放Connection類(它被設置爲委託)的任何實例(在運行循環中導致EXC_BAD_ACCESS)可能),而你沒有提及它。

的解決方法是調用保留在連接類,像這樣:

Connection *connection = [[Connection alloc] init]; 
[connection retain]; 

或者如果你啓用了ARC,使一個實例變量的類,你ALLOC連接,存儲您的實例在那裏連接。這樣ARC就不會解除它的分配,因爲實例變量var作爲參考。

相關問題