Доступ к массиву по индексу, переданному вызовом функции - PullRequest
0 голосов
/ 12 июня 2011

Я написал специальную функцию init-override, где я хочу передать индексный номер для вызова в массиве.Сам номер индекса определяется путем выбора таблицы в представлении таблицы пользователем.Итак ... выбранное число должно быть передано в функцию init и использовано там для дальнейшей обработки.

Что ж, теперь возникла моя проблема. По моему мнению, все методы, которые я создал, правильно закодированы.Но когда я нажимаю на свою определенную кнопку подключения, в консоли появляется сообщение об ошибке, что индекс выходит за пределы.Итак ... Я проверил массив для записей, и там все доступно.Так что номер индекса должен быть в порядке.

Возможно, к вашему сведению: я создал копию массива в TableViewController, который изначально находится в файле PortConnection.

Вот необходимые файлы.Кто-нибудь может дать мне руку помощи, где искать?

PORTTABLEVIEWCONTROLLER.M

- (IBAction)pushConnect:(id)sender {
    NSInteger selectedRow = [tableView selectedRow];
    [portConnection initPort:selectedRow];
}

- (id)init {
    self = [super init];
    if (self) {
        // Initialization of port Connection instance
        portConnection = [[PortConnection alloc] init];
        // Fill array in Portconnection.m with devices
        [portConnection listDevices];
        // Fill tableView Data Array with data from portConnection array
        self.tableViewDataArray = [NSMutableArray arrayWithArray:portConnection.portArray];
    }
    return self;
}

PORTCONNECTION.H

@

interface PortConnection : NSObject {
    // Instance of AMSerialPort
    AMSerialPort *port;

    // Port Array to be filled with found ports
    NSMutableArray *portArray;
}

// List Devices into an given array
- (void)listDevices;

// Connect to selected port
- (void)initPort:(NSInteger)selectedRow;

@property (nonatomic, retain) NSMutableArray *portArray;
@property (nonatomic, retain) AMSerialPort *port;
@end

PORTCONNECTION.M

@implementation PortConnection

@synthesize port;
@synthesize portArray;

#pragma mark -
#pragma mark Serial Port Access

- (void)listDevices {

    // get an port enumerator
    NSEnumerator *enumerator = [AMSerialPortList portEnumerator];
    AMSerialPort *aPort;

    while ((aPort = [enumerator nextObject])) {
        [portArray addObject:[PortItem portItemWithTitle:[aPort name] andPath:[aPort bsdPath]]];
    }
}

- (void)initPort:(NSInteger)selectedRow {
    //Create object of selected port searched in array
    PortItem *portSelected = [portArray objectAtIndex:selectedRow];
    NSString *deviceNameSelected = [portSelected valueForKey:@"bsdPath"];

    // Start Connection
    if (![deviceNameSelected isEqualToString:[self.port bsdPath]]) {
        [self.port close];
        [self setPort:[[[AMSerialPort alloc] init:deviceNameSelected withName:deviceNameSelected type:(NSString *)CFSTR(kIOSerialBSDModemType)] autorelease]];
        [self.port setDelegate:self.port];

        if ([self.port open]) {
            NSLog(@"Connected...");
            [self.port setSpeed:B38400];
            [self.port readDataInBackground];
        } else {
            NSLog(@"error connecting");
            [self setPort:nil];
        }
    }
}

#pragma mark -
#pragma mark initialization / deallocation

- (id)init {
    self = [super init];
    if (self) {
        portArray = [NSMutableArray array];
    }
    return self;
}

- (void)dealloc {
    portArray = NULL;
    [super dealloc];
}

@end

Ну ... моя идея в том, что что-то не так с методом INITPORT: (NSINTEGER) SELECTEDROW, но я совсем не уверен ....

Спасиботак много, что снова дал мне совет!

Себастьян

1 Ответ

0 голосов
/ 12 июня 2011

Ваша проблема в этой строке,

portArray = [NSMutableArray array];

Хотя это переменная retain ed, она сохранит значение при использовании метода установки свойств.Это прямое назначение объекта autorelease d будет выпущено через некоторое время, и, если все другие объекты сохранят его (чего не происходит), он должен быть освобожден.Это то, что вы не хотите.Исправьте это, используя установщик свойств,

self.portArray = [NSMutableArray array];
...