2

我在这里定义了这个变量:

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 (code = 1, address=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];
}
4

2 回答 2

2

你在使用一些 pre-ARC 库吗?如果是这样,我怀疑某人(我的意思是一些代码)正在手动释放一次gridCoordinate引用的对象。

这会导致对象被释放,并且您最终会引用错误的内存位置(因为对象已消失)。

如果您有 SDataGridCoord 的源代码,请在 dealloc 方法中添加一个断点,并在尝试使用该对象之前查看它是否被调用

- (void)ChangeCellWithStringDate :(NSString *)stringDate

最后,如果发生这种情况,您应该创建另一个 SDataGridCoord 对象(仅属于您的副本)并将其分配给您的 ivar。它将由 ARC 管理,一切都会好起来的。

于 2015-04-30T19:55:06.907 回答
0

尝试将变量添加到 .m 的接口

@interface YOUR_OBJECT ()
{
    SDataGridCoord *_clickedGridCoord;
}
@end
于 2015-04-29T23:59:57.333 回答