此版本调用会导致仪器崩溃吗?

时间:2011-03-02 21:17:30

标签: iphone objective-c memory-leaks release instruments

我有一个名为CategoryViewController的类,它的viewDidLoad方法调用此方法:

  - (void)reset {
    Category * c = [[Category alloc] initWithId:0 title:@"Categories"];
    [self setCategory:c];
    [c release];  // <--- line of code I am interested in
    self.title = @"Categories";
    [self fillCategory];
}

在大多数情况下,此处的类别为nu​​ll,但有时需要在分配类别后调用reset。没有我在代码中标记的行,程序构建和调试就好了,我可以拉起仪器并检查我的泄漏。我能找到的唯一泄漏是从这个函数初始化的类别(因为没有发布,我在已经初始化的CategoryViewController上调用此函数时会出现泄漏)。

如果我尝试按照c,Instruments,XCode和Simulator上的版本运行此方法,则所有操作都开始奇怪,崩溃和冻结,给我随机的SIGABRT和SIGKILL。我可以使用那里的代码行来构建和调试,但是Instruments甚至不会启动我的应用程序。谁能给我一个暗示这里发生了什么?

编辑:更多代码

@implementation Category
@synthesize title, articleCount, seeAlso, categoryId, articles, subcategories;

- (id)initWithId:(NSInteger)cid title:(NSString*)t{
    self.title = t;
    self.categoryId = cid;
    [self setArticles:[[NSMutableArray alloc] init]];
    [self setSubcategories:[[NSMutableArray alloc] init]];
    [self setSeeAlso:[[NSMutableArray alloc] init]];
    self.articleCount = 0;
    return self;
}

2 个答案:

答案 0 :(得分:1)

如果你花时间在网上发布这些东西似乎很容易解决,这很有趣。在发布了类别初始化代码后,我意识到我没有正确地发布我所做的分配。在适当的内存管理之后,我的泄漏以及我的崩溃似乎已经消失了:

- (id)initWithId:(NSInteger)cid title:(NSString*)t{
    self.title = t;
    self.categoryId = cid;
    NSMutableArray * m = [[NSMutableArray alloc] init];
    [self setArticles:m];
    [m release];
    m = [[NSMutableArray alloc] init];
    [self setSubcategories:m];
    [m release];
    m = [[NSMutableArray alloc] init];
    [self setSeeAlso:m];
    [m release];
    self.articleCount = 0;
    return self;
}

答案 1 :(得分:0)

假设您的属性声明如下,我没有看到您突出显示的行有任何问题,也没有看到代码的其余部分:

@property (retain) Category *c;

只是在黑暗中拍摄,但上次Xcode,乐器和模拟器做了疯狂的事情,我进行了无限的递归。

您确定自己的方法fillCategory没有以某种方式调用viewDidLoadreset方法吗? 在reset方法的第一行设置断点时会发生什么情况,并逐步按照您的代码进行操作?

相关问题