Incorrect decrement of the reference count of an object that is not owned at this point by the calle

34 篇文章 0 订阅
Incorrect decrement of the reference count of an object that is not owned at this point by the caller


这种问题一般就是变量申请了内存并初始化了,但没有使用此变量,接着将此变量又重新赋值。如下:

Java代码  
  1. NSString *imageString = [[NSString alloc] init];  
  2. imageString = @"HResout";  



Problem with stringByAppendingString and retain count


I need to concatenate some strings.

<code><span class="typ">NSString</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> sportName </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="typ">NSString</span><span class="pln"> alloc </span><span class="pun">]</span><span class="pln">initWithString</span><span class="pun">:@</span><span class="str">""</span><span class="pun">];</span><span class="pln">
sportName </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">sportName stringByAppendingString</span><span class="pun">:[</span><span class="pln">someObject getString</span><span class="pun">]];</span><span class="pln">
</span><span class="com">// can be more stringByAppendingString</span><span class="pln">
</span><span class="pun">...</span><span class="pln">
</span><span class="pun">[</span><span class="pln">sportName release</span><span class="pun">];</span><span class="pln">
</span></code>

But something strange for me give the 'build and analyze' command:

on string:

<code><span class="pln">sportName </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">sportName stringByAppendingString</span><span class="pun">:[</span><span class="pln">someObject getString</span><span class="pun">]];</span><span class="pln"> 
</span></code>

the error:Method returns an Objective-C object with a +0 retain count (non-owning reference)

on string:

<code><span class="pun">[</span><span class="pln">sportName release</span><span class="pun">];</span><span class="pln">
</span></code>

the error: Incorrect decrement of the reference count of an object that is not owned at this point by the caller

I am using it for filling my TableView and it is crashed after loading :(.



<code><span class="typ">NSString</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> sportName </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="typ">NSString</span><span class="pln"> alloc </span><span class="pun">]</span><span class="pln">initWithString</span><span class="pun">:@</span><span class="str">""</span><span class="pun">];</span><span class="pln">
sportName </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">sportName stringByAppendingString</span><span class="pun">:[</span><span class="pln">someObject getString</span><span class="pun">]];</span><span class="pln">
</span></code>

In 2nd line you are getting a new string which is assigned back to spotName. So the alloced string in first line is leaked. I don't understand why you need to append in an empty string. Appending to @"" is practically of no effect. And if you have some non-empty string then you can create that as autoreleased string instead of alloc. Like this:

<code><span class="com">// create an autoreleased string</span><span class="pln">
</span><span class="typ">NSString</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> sportName </span><span class="pun">=</span><span class="pln"> </span><span class="pun">@</span><span class="str">"my_string"</span><span class="pun">;</span><span class="pln">
</span><span class="com">// this will return a new string which is also autoreleased</span><span class="pln">
sportName </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">sportName stringByAppendingString</span><span class="pun">:[</span><span class="pln">someObject getString</span><span class="pun">]];</span><span class="pln">
</span><span class="com">// all subsequent call to stringByAppendingString will return autoreleased string</span><span class="pln">
</span><span class="com">//so no need to release spotName</span><span class="pln">
</span></code>

And if you need to retain spotName then you can retain that or use a property.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值