我正在对我正在创建的应用程序进行调试,但运行的工具我发现了一个我无法理解的内存泄漏。
如果我尝试按照Instruments建议修改代码,我的应用程序因
而崩溃消息发送到解除分配的实例
有人可以帮助我吗?
- (void) objectAtIndex:(int)index {
SpecialObject *specialObj = [SpecialObject sharedInstance];
id model = [self.datasource objectAtIndex:index];
if ([model isKindOfClass:[ClassA class]]) {
ClassA *objA = (ClassA *)model;
specialObj.title = objA.title;
} else if ([model isKindOfClass:[ClassB class]]) {
ClassB *objB = (ClassB *)model;
specialObj.title = objB.title;
}
}
self.datasource
是NSMutableArray
而specialObj.title
是NSString
它们被定义为@property(nonatomic, retain)
。
我的问题是乐器告诉我这两个
ClassA *objA = (ClassA *)model;
ClassB *objB = (ClassB *)model;
是泄漏,但如果我发布objA
和objB
我的应用程序崩溃。
感谢您的帮助!
答案 0 :(得分:0)
我的猜测是你永远不会释放数据源。假设您没有使用ARC,在dealloc
方法中,您应该
[self setDataSource: nil];
或
[instanceVariableThatBacksDataSourceProperty release];
许多人做前者,但Apple建议使用后者,以便在解除分配期间不会触发KVO。
答案 1 :(得分:0)
泄漏和你的异常是不同的事情。几乎可以肯定的是,释放了一些你不应该发布的东西。
你们两个都表明你对Objective-C内存管理的理解不是很好。
您应该首先集中精力理解异常,这样做的第一步是查看exception traceback。
答案 2 :(得分:0)
经过一些搜索我发现了问题:XCode 通常告诉泄漏的位置,但有时它会给你一个可能的位置。
这意味着内存泄漏位于程序流程中的某个位置,直到XCode指示的位置,不一定就是它所说的位置。
希望将来可以帮助其他人!