1

我在 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;

theLink在我的视图控制器makeGame的方法中调用的方法中设置: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设置或设置为什么,程序总是在同一点崩溃。

4

2 回答 2

0

如果 theLink 被设置为传递给它的参数,@"ptl" 或一些类似的临时字符串,它会给你一个问题,因为它只是一个指向当前位置的指针,它持有@"ptl"。makeGame 方法完成后,您的系统将假定这一切都是用@"ptl" 完成的,然后将其释放。

当您在代码中创建 @"stringwhatever" 时,它应该等同于创建一个 NSObject,它是 @"stringwhataver" 的不可变文字实例。理论上,它应该以一种很好的方式处理所有引用计数,但是当您进行自己的内存管理时,有很多方法会丢失引用计数。

于 2013-06-08T02:03:22.890 回答
0

有一个非常简单的规则可以遵循。如果您已声明属性,请通过 property 访问它们。否则(如您在上面所做的那样, with theLink = ...)会绕过属性访问器中内置的所有内存管理。

self.theLink = ...

在 MRC 下会解决这个问题。在您不了解根本原因的情况下,切换到 ARC 已经“解决”了您的问题。

于 2013-06-08T07:19:29.093 回答