Цель - 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