EXC_BREAKPOINT:发送到解除分配的实例的消息

时间:2013-06-08 01:12:49

标签: ios objective-c memory dealloc

我在XCode 4.6中收到了上述消息。我做了一个非常彻底的搜索,但似乎没有任何东西符合我的问题的确切情况。不可否认,我对iOS开发相对较新,内存管理从来都不是我的强项,但这让我感到非常恼火。

我有一个实例变量theLink,它在类Game中定义如下:

@interface Game : NSObject

// Class objects
@property(nonatomic,retain) NSMutableArray *queryItems;
@property(nonatomic,retain) NSMutableArray *theArray;
@property(nonatomic,retain) NSString *theLink;
@property(nonatomic,retain) NSString *thePath;

theLinkmakeGame方法中设置,该方法在我的视图控制器中的方法initialiseGame中调用:

- (void) initialiseGame
{
    bool gameCreated = FALSE;
    while (!gameCreated)
    {
        gameCreated = [theGame makeGame:@"ptl"];
    }
    [loadingIndicator stopAnimating];
    [loading setText:@"Tap to Start"];
    [self performSelector:@selector(setLabels) withObject:nil afterDelay:0.0];
}

(注意:performSelector afterDelay用于允许视图在继续之前更新。有点破解,但我无法找到更好的方法!)

应用程序然后加载游戏,当用户点击屏幕开始时,从视图控制器调用的下一个方法是:

- (void) setupLink
{
    ...
    for(int i=0; i<[theGame.theLink length]; i++) {
        ...
    }
}

这是对theGame.theLink的引用,我正在接受崩溃。

让我最困惑的是,如果我从theGame.theLink方法中调用initialiseGame,它会正确显示,并且还会调用Game类中的任何其他变量(例如thePaththeArray工作正常,因此theGame对象尚未完全取消分配,只有变量theLink

在我看来,当视图控制器正在更新时,变量正在某处解除分配。我没有发布变量,并且无法解决为什么只有这个变量被释放。正如我在开始时所说的,记忆管理不是我的力量!

非常感谢任何帮助/想法。如果您需要更多详细信息,请与我们联系。

谢谢堆, 安德鲁

编辑:在theLink

中设置makeGame
- (bool) makeGame:(NSString*)gameType
{
    ...
    [self getLink];
}

- (void) getLink
{
    ...

    if (... && ((arc4random() % 10) > 8))
    {
        theLink = @"Animals";
    }
}

根据随机数和其他因素,可以设置theLink的方式有很多种。这是最基本的形式,只是将其设置为静态字符串。无论theLink如何设置或设置如何,程序总是在同一点崩溃。

2 个答案:

答案 0 :(得分:0)

如果将link设置为传递给它的参数,@“ptl”或一些类似的临时字符串,它会给你一个问题,因为它只是一个指向当前位置的指针@“ptl ”。 makeGame方法完成后,你的系统将假设它完全用@“ptl”完成并释放它。

当你在代码中创建一个@“stringwhatever”时,它应该相当于使一个NSObject成为@“stringwhataver”的不可变文字实例。从理论上讲,它应该以一种很好的方式处理所有引用计数,但是当你进行自己的内存管理时,有很多方法可以减少你的引用计数。

答案 1 :(得分:0)

要遵循一条非常简单的规则。如果您已声明属性,则通过属性访问它们。否则(如上所述,使用theLink = ...)绕过属性访问器中内置的所有内存管理。

self.theLink = ...

可以在MRC下解决这个问题。切换到ARC已“解决”您的问题,而无需了解根本原因。