IOS:分发(发布)配置错误和崩溃

Posted

技术标签:

【中文标题】IOS:分发(发布)配置错误和崩溃【英文标题】:IOS : Distribution (release) configuration bugs and crashes 【发布时间】:2011-01-22 12:33:35 【问题描述】:

我已经创建了一个应用程序来解决数独网格...但是 这是我的问题:我的应用程序有一些错误,甚至在我的分发配置编译时崩溃(相当于发布配置)。

这是它的错误代码:

- (int*)completeNb:(int[9][9])aMatrix 
    int n, nb;
    int cell[2];
    int *pcell;
    BOOL found = FALSE;
    BOOL pos = FALSE;
    for (int k = 1; k <= 9; k++) 
        n = 0;
        for (int i = 0; i < 9; i++) 
            for (int j = 0; j < 9; j++) 
                if (aMatrix[i][j] == k)
                    n++;
            
        
        if (n == 8) 
            found = TRUE;
            nb = k;
            break;
        
    
    if (found) 
        for (int l = 0; l < 9; l++) 
            for (int m = 0; m < 9; m++) 
                if ([self isPossibleValue:aMatrix value:nb line:l column:m]) 
                    cell[0] = l;
                    cell[1] = m;
                    pos = TRUE;
                    break;
                
            
            if (pos)
                break;
        
        pcell = cell;
    
    else 
        pcell = nil;
    
    return pcell;

我有一个特殊的数独网格,我应该在其中找到 6,6 作为数字 6 的正确位置(6 应该在 i=6j=6在网格中)。它在调试配置中完美运行,但使用 Distrib Conf,似乎我对 lm vars 有问题 -> 循环在 l= 处中断得很好6m=6 (因此,isPossibleValue 函数似乎运行良好),但是我的 cell 变量等于 1;0,而不是 6;6!

我正在将这种过程(返回一个cell[2])与许多其他功能一起使用,并且我对 Distrib Conf 没有任何问题。

我的第二个问题 - 这个问题导致应用程序崩溃 - 是使用以下代码(再次,完美地使用调试配置)。

- (void)solver:(int[9][9])aMatrix 
    if (!Termine) 
        int *emptyCell = [self firstEmptyCell:aMatrix];
        if (emptyCell != nil) 
            int i = emptyCell[0];
            int j = emptyCell[1];
            for (int k = 1; k <= 9; k++) 
                if ([self isPossibleValue:aMatrix value:k line:i column:j]) 
                    aMatrix[i][j] = k;
                    [self solver:aMatrix];
                    aMatrix[i][j] = 0;
                
            
        
        else 
            if (!Termine) 
                Termine = TRUE;
                for (int i = 0; i < 9; i++)
                    for (int j = 0; j < 9; j++)
                        res[i][j] = aMatrix[i][j];
            
        

    

注意:一种解决方案——我不确定这是最好的——将优化级别从“最快、最小”更改为“无”。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

对于第一种情况,问题出在int cell[2];。它有一个本地范围,在你从函数返回后,这个数组指向的内存区域很可能会被重新分配用于其他需要。一个快速的解决方案是添加static 说明符:

static int cell[2];

对于第二个 sn-p,确保 emptyCell 每次分配给 ij 的值不超过 aMatrix 边界 [0..8][0..8]。

【讨论】:

感谢您的回答。我应该怎么做才能解决 int cell[2] 的第一个问题? (它总是返回 1,0)我应该使用全局变量吗?对于 emptyCell 函数,它不应该将 i,j 返回到 aMatrix 边界之外,但我使用相同的过程来返回坐标(使用 int cell[2]...) 啊,您通过编辑帖子回答了问题。我正在尝试使用“静态”一词 对于第一种情况,最简单的方法是为 'cell' 声明添加 'static' 说明符。但是,如果您想创建多个实例,则需要“一个接一个”地复制每个“数组”元素。 Here 是关于返回数组的优秀文档。 它适用于指定的静态,非常感谢!创建多个实例是什么意思?在同一个功能中? 例如,如果您想使用此函数填充 2 个或更多数组,如下所示:int *a = [obj completeNb:aMatrix1];int *b = [obj completeNb:aMatrix2]; 在这种情况下,ab 将指向同一个内存区域因此将包含相同的值。

以上是关于IOS:分发(发布)配置错误和崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用临时分发的设备崩溃

Xcode 找不到 iOS 分发证书

缺少 (null) 的 iOS 分发签名身份

IOS Ad Hoc 分发链接啥都不做

为啥即使配置文件设置为分发,xcode 也会抛出此错误?

分发企业应用程序时 XCode 崩溃且没有错误