NSArray 与 componentsSeparatedByString 内存泄漏
Posted
技术标签:
【中文标题】NSArray 与 componentsSeparatedByString 内存泄漏【英文标题】:NSArray with componentsSeparatedByString memory leak 【发布时间】:2011-04-05 12:45:38 【问题描述】:我在使用此函数时遇到内存泄漏问题。我认为使用 componentsSeparatedByString 创建一个 NSArray 是自动释放,但仪器似乎表明 NSArray aPair 存在泄漏。为什么它会表明那里有泄漏,而不是在以相同方式创建的其他 NSArray 处?
-(void) checkRequest: (NSString *)request view:(UIViewController *)theView webView:(UIWebView *)wView
//NSLog(@"JSResponder - checkRequest()");
NSString *aRequest = [NSString stringWithString:request];
NSArray *urlArray = [aRequest componentsSeparatedByString:@"?"];
if([urlArray count] > 1)
NSString *paramsString = [urlArray lastObject];
NSString *cmd = @"";
NSArray *urlParamsArray = [paramsString componentsSeparatedByString:@"&"];
int numCommands = [urlParamsArray count];
NSMutableDictionary *paramsWithNames = [[NSMutableDictionary alloc ] initWithCapacity:numCommands];
for (NSString *elementPair in urlParamsArray)
NSArray *aPair = [elementPair componentsSeparatedByString:@"="];
NSString *aKey = [aPair objectAtIndex:0];
NSString *aParam = [aPair objectAtIndex:1];
if([aKey compare:@"_command"] == NSOrderedSame)
cmd = aParam;
else
[paramsWithNames setValue: aParam forKey:aKey];
[self executeCommand: cmd withParams: paramsWithNames view:theView webView:wView];
[paramsWithNames release];
这个函数被以下函数调用:
- (void)pullJSEvent:(NSTimer*)theTimer
NSLog(@"MainView - pullJSEvent()");
NSString *jsCall = [NSString stringWithString:@"if(typeof checkOBJCEvents == 'function')checkOBJCEvents();"];
NSString *jsAnswer = [[webView stringByEvaluatingjavascriptFromString:jsCall] retain];
if([jsAnswer compare:@"none"] != NSOrderedSame)
//NSLog(@" answer => %@", jsAnswer);
[jsResponder checkRequest:jsAnswer view:(UIViewController *)self webView:self.webView];
[jsAnswer release];
谢谢
【问题讨论】:
【参考方案1】:您将不得不使用 Leaks 工具进行更深入的挖掘。您正在泄漏数组中的一个字符串,而不是数组本身。泄漏指示该行,因为这是分配数组中的字符串的位置。
进入泄漏,查看泄漏的实例,然后单击那个小箭头按钮。您将看到泄漏对象的所有保留和释放,这应该可以指出问题所在。
【讨论】:
以上是关于NSArray 与 componentsSeparatedByString 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
如何将 NSArray 和 NSArrayController 与 Core Data 一起使用?