客观 c subStringToIndex 内存泄漏

Posted

技术标签:

【中文标题】客观 c subStringToIndex 内存泄漏【英文标题】:objective c subStringToIndex memory leak 【发布时间】:2011-10-22 22:37:29 【问题描述】:

我将 xcode 4.2 用于 10.6 和 ios 5,当我使用 xcode 分析项目时报告了这个奇怪的内存泄漏。

代码如下:

- (void) imagePickerController: (UIImagePickerController*) reader
didFinishPickingMediaWithInfo: (NSDictionary*) info

id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];
ZBarSymbol *symbol = nil;
for (symbol in results) break;
[reader dismissModalViewControllerAnimated: NO];

[self beep];
NSString *upcScanned = [NSString stringWithFormat:@"0%@", symbol.data]; //line 1
NSString * name = [self getItemName:upcScanned];
ProductNameDialog *dialog = [[ProductNameDialog alloc] initWithNibName:@"ProductNameDialog" bundle:nil];

//dialog.upcScanned = [upcScanned substringToIndex:[upcScanned length] - 1];//line 2
[name release];
[self presentModalViewController:dialog animated:YES];
[dialog release];        

line2 是报告内存泄漏的行。

【问题讨论】:

添加断点或者登录对话框发布看看是否真的被调用了。 您是否也在对话框的dealloc 方法中释放upcScanned(或将其设置为nil,因为您尚未定义实例变量)? viewDidUnload 不一定会被调用,它通常只在内存不足的情况下使用。 泄漏检测器报告分配泄漏对象的行。静态分配的字符串永远不会被视为泄漏。您可能在其他一些方法中使用 upcScanned,但保留不平衡。 【参考方案1】:

最合乎逻辑、最可能的结论是方法[self getItemName:upcScanned]保留传入的字符串但不释放它。

【讨论】:

以上是关于客观 c subStringToIndex 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

java 线程泄之一

内存泄漏与垃圾回收机制

ios开发之--NSString中substringFromIndex,substringWithRange,substringToIndex方法的使用

NSMakeRange,substringWithRange,substringToIndex,substringFromIndex区别和联系

@throws 或 NSError 哪个适用于客观 C api 类型的方法

OpenGL VBO 会泄漏内存吗?