【发布时间】:2011-03-02 21:17:30
【问题描述】:
我有一个名为 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];
}
在大多数情况下,此处的类别为空,但有时需要在分配类别后调用重置。如果没有我在代码中标记的行,程序构建和调试都很好,我可以拉起仪器并检查我的泄漏。我能找到的唯一泄漏是从此函数初始化的类别(因为没有释放,在已初始化的 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;
}
【问题讨论】:
-
如果我围绕这段代码创建一个简单的虚拟类,它会正常工作,因此我们无法根据您提供的内容诊断错误。我们需要看看
initWithId:title:和setCategory:背后的代码。 -
如何为
category声明@property? -
category是保留属性吗?如果是,那么您是否使用自己的方法覆盖 Apple 生成的 settersetCategory?如果是,那么您需要在该方法中保留传入的类别对象。在这里只是在黑暗中拍摄,因为给定的信息不足以知道导致崩溃的原因。 -
类别是保留属性
标签: iphone objective-c memory-leaks release instruments