EXC_Bad_Access при вызове метода из класса - PullRequest
1 голос
/ 15 июля 2011

All

У меня есть контроллер представления (назовем его testViewController), который вызывает метод в другом классе (сканирование имени класса, имя метода initNetworkCommunication).

Вот метод кнопки контроллера вида:

-(IBAction) test
{
    Scan *canConnect = [[Scan alloc] init];
    [canConnect initNetworkCommunication];
}

А вот и класс

//scan.h

@interface Scan : NSObject <NSStreamDelegate>
{
    NSInputStream *inputStream;
    NSOutputStream *outputStream;
}

-(void) scan;
-(void) initNetworkCommunication;

@property (nonatomic, retain) NSInputStream *inputStream;
@property (nonatomic, retain) NSOutputStream *outputStream;


@end

//scan.m

#import "Scan.h"

@implementation Scan

@synthesize inputStream, outputStream;

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

-(void) initNetworkCommunication
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.17.1", 2004, &readStream, &writeStream);
    NSLog(@"readStream %@", readStream);
    NSLog(@"writeStream %@", writeStream);
    inputStream = (NSInputStream *) readStream;
    outputStream = (NSOutputStream *) writeStream;//this __strong may work!
    NSLog(@"inputStream %@", inputStream);
    NSLog(@"outputStream %@", outputStream);
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];
    NSLog(@"She be opened, sir!");
    return;
}
//more code is here, dealloc, etc

Я получаю EXC_BAD_ACCESS, и когда я включаю NSZombieEnable, мой сеанс отладки выглядит так:

2011-07-15 13:09:46.210 Project[1176:f203] readStream <__NSCFInputStream: 0x6e7a2a0>
2011-07-15 13:09:46.212 Project[1176:f203] writeStream <__NSCFOutputStream: 0x6e7a340>
2011-07-15 13:09:46.213 Project[1176:f203] inputStream <__NSCFInputStream: 0x6e7a2a0>
2011-07-15 13:09:46.214 Project[1176:f203] outputStream <__NSCFOutputStream: 0x6e7a340>
2011-07-15 13:09:46.215 Project[1176:f203] She be opened, sir!
2011-07-15 13:09:46.220 Project[1176:f203] *** -[Scan respondsToSelector:]: message sent to deallocated instance 0x6e79b20
Current language:  auto; currently objective-c
(gdb) 

Он падает на три звездочки, и это мое сообщение зомби.

Что мне делать?

РЕДАКТИРОВАТЬ: после запуска программы в инструментах, я не вижу утечек памяти. То, что меня привлекает, отображается в инструментах как SocketStream :: dispatchSignalFromSocketCallbackUnlocked (SocketStream)

Ответы [ 3 ]

5 голосов
/ 15 июля 2011

Вы забыли сохранить объект Scan, который является делегатом потока.

До тех пор, пока потоки не будут закрыты, ваш делегат потока будет получать сообщения, и если делегат будет освобожден, то ваше приложение будет аварийно завершено..

В вашем примере кода (где вы пропускаете объект canConnect) все должно быть хорошо, но в вашем реальном коде вы могли бы выпустить объект Scan слишком рано.

0 голосов
/ 05 мая 2014

Просто удалите inputStream и outputStream из свойств и оставьте для них только переменные класса.
В случае ARC это помогает.

@interface Scan: NSObject <NSStreamDelegate> {
    NSInputStream * inputStream;
    NSOutputStream * outputStream;
}
....
@end

В моем случае это решило все проблемы. Было невозможно решить это по-другому.

0 голосов
/ 15 июля 2011

изменить inputStream, outputStream на self с точечным синтаксисом везде

как это везде

потому что, если вы синтезируете свойство, вам придется использовать self с точечным синтаксисом, чтобы сохранить их.

self.inputStream = (NSInputStream *) readStream;

self.outputStream = (NSOutputStream *) writeStream;//this __strong may work!

я предлагаю вам изменить имя функции

initNetworkСвязь с некоторыми

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...