Цель - C вызывающая переменная не работает

У меня есть эта переменная, определенная здесь:

const SDataGridCoord *clickedGridCoord;

и я заполняю это в этом методе:

- (void)shinobiDataGrid:(ShinobiDataGrid *)grid willSelectCellAtCoordinate:(const SDataGridCoord *)gridCoordinate
{
    if ((gridCoordinate.column.displayIndex==5||gridCoordinate.column.displayIndex == 6 || gridCoordinate.column.displayIndex == 7 ) && dataSource.dataForDatabase)
    {
        clickedGridCoord  = gridCoordinate;
        [self CreateCellDateModPopup:gridCoordinate];
    }
}

и я использовал точку останова и вижу, что она заполняется.

Но когда я это называю, он пуст:

CellData *cell = [dataSource.cellHolder objectAtIndex:clickedGridCoord.row];

и под пустым я подразумеваю, что нет строки или столбца, но есть, когда я впервые заполняю SDataGridCoord.

Что я делаю не так, больше ничего не переопределяет переменную.

Я попробовал это:

SDataGridCoord *clickedGridCoord;

затем

- (void)shinobiDataGrid:(ShinobiDataGrid *)grid willSelectCellAtCoordinate:(const SDataGridCoord *)gridCoordinate
{
    if ((gridCoordinate.column.displayIndex==5||gridCoordinate.column.displayIndex == 6 || gridCoordinate.column.displayIndex == 7 ) && dataSource.dataForDatabase)
    {
        clickedGridCoord = (SDataGridCoord *)gridCoordinate;
        [self CreateCellDateModPopup:gridCoordinate];
    }
}

все тот же результат, и мое приложение все еще падает: поток 1:EXC_BAD_ACCESS (код = 1, адрес =0xc000000c)

Мой.m файл:

@interface Controller()
{
     SDataGridCoord *clickedGridCoord;
}

@implementation Controller

- (void)shinobiDataGrid:(ShinobiDataGrid *)grid willSelectCellAtCoordinate:(const SDataGridCoord *)gridCoordinate
{
    if ((gridCoordinate.column.displayIndex==5||gridCoordinate.column.displayIndex == 6 || gridCoordinate.column.displayIndex == 7 ) && dataSource.dataForDatabase)
    {
        clickedGridCoord = (SDataGridCoord *)gridCoordinate;
        [self CreateCellDateModPopup:clickedGridCoord];
    }
}


- (void)ChangeCellWithStringDate :(NSString *)stringDate
{
    //My app crashes here with this error: Thread 1:EXC_BAD_ACCESS (code = 1, address=0xc000000c)
    CellData *cell = [dataSource.cellHolder objectAtIndex:clickedGridCoord.row.rowIndex];
}

2 ответа

Решение

Вы используете какую-нибудь пред-ARC библиотеку? Если это так, я подозреваю, что кто-то (и кто-то имеет в виду некоторый код) вручную выпускает еще раз объект, на который ссылается gridCoordinate.

Это приводит к тому, что объект освобождается, и в результате вы получаете ссылку на неправильную область памяти (потому что объект исчез).

Если у вас есть исходный код SDataGridCoord, добавьте точку останова в метод dealloc и посмотрите, вызывается ли она, прежде чем пытаться использовать объект в

- (void)ChangeCellWithStringDate :(NSString *)stringDate

Наконец, если это происходит, вы должны создать еще один объект SDataGridCoord (копия, которая будет только вашей) и назначить его вашему ivar. Он будет управляться ARC, и все будет хорошо.

Попробуйте добавить вашу переменную в интерфейс вашего.m

@interface YOUR_OBJECT ()
{
    SDataGridCoord *_clickedGridCoord;
}
@end
Другие вопросы по тегам