首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet上获得泄漏]

在stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet上获得泄漏]
EN

Stack Overflow用户
提问于 2010-06-28 19:45:38
回答 1查看 2K关注 0票数 1

我在下面的代码中遇到了漏洞:

search.h

代码语言:javascript
复制
NSString *str;

search.m

代码语言:javascript
复制
-(void)searchMethod:(UISearchBar *)aSearchBar
{
     /*******Showing leak at below line *************/
     str=[aSearchBar.text stringByTrimmingCharactersInSet:
                   [NSCharacterSet whitespaceAndNewlineCharacterSet]];
 }

我不知道如何解决这个问题,有人能帮我解决这个问题吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-28 20:04:25

你怎么知道这是泄密的?在您的示例中,str是自动释放的,这意味着它将在此方法返回一段时间后释放自身。只有在没有自动释放池的单独线程上执行此任务,或者使用从未清除过的自动释放池,str才会泄漏。如果这段代码运行在主线程上,str肯定不会泄漏。

我认为你崩溃是因为你没有保留str。您将字符串存储到一个全局变量中,但不会增加保留计数。这意味着一旦字符串被自动释放,grobal变量就会指向无效内存。为了确保对象在方法作用域之外保持活动状态,您必须保留它(除非您通过alloc/init...,new...创建此对象。或复制...)。

代码语言:javascript
复制
str = [aSearchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
str = [str retain]; // Keep object alive beyond the scope of this method

当然,如果像这样保持对象存活,则必须自己在代码中的某个位置释放它。因此,如果希望在每次调用该方法时覆盖此变量,请使用

代码语言:javascript
复制
[str release];
str = [aSearchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
str = [str retain]; // Keep object alive beyond the scope of this method

不要忘了在这个对象的dealloc方法中释放str (为此覆盖dealloc;不要忘记在被覆盖的方法中作为最后一条指令调用[super dealloc] )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3132030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档