菜鸟教程小白 发表于 2022-12-13 10:23:07

iphone - 对象 dealloc 仅在 iOS 4.3 中崩溃


                                            <p><p>我试图弄清楚为什么使用 didSelectRowAtIndexPath 在我的 tableView 中推送 viewController 会导致 iOS 4.3 中的崩溃,但在 iOS 5.0+ 中,它可以正常工作。</p>

<p>当我打电话时它就崩溃了:</p>

<pre><code>self.customViewController = [[ initWithNibName:@&#34;CustomViewController&#34;bundle:nil] autorelease];
</code></pre>

<p>第一次推送 customViewController 之后的任何时间。</p>

<p>这是我的相关代码:</p>

<pre><code>@property (nonatomic, retain) CustomViewController *customViewController;

-(void) dealloc // Dealloc of tableView.
{

;
customViewController = nil;

}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

self.customViewController = [[ initWithNibName:@&#34;CustomViewController&#34;bundle:nil] autorelease]; // Release old, allocate new, set it.

[ pushViewController:customViewController animated:YES];
; // Balance out pushViewController&#39;s retain.


}
</code></pre>

<p>谢谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><pre><code>- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.customViewController = [[ initWithNibName:@&#34;CustomViewController&#34;bundle:nil] autorelease];
[ pushViewController:customViewController animated:YES];
; // Balance out pushViewController&#39;s retain. ----&gt;NO
}
</code></pre>

<p>最后一个<code>release</code>是多余的,不需要。<br/>
您已经对其进行了 <code>autorelease</code> 以使其 <code>retain count</code> 减一。 </p>

<hr/>

<p>我们将分析这一行</p>

<pre><code>self.customViewController = [[ initWithNibName:@&#34;CustomViewController&#34;bundle:nil] autorelease];
</code></pre>

<p>你创建一个 <code>CustomViewController</code> 保留计数 == 1。<br/>
您在上面说 <code>autorelease</code> 所以保留计数稍后会为 0(可能是运行循环的结尾),但现在它仍然是 1 这就是为什么您仍然可以访问它,但将其视为 0 .<br/>
之后你说<code>self.customViewController</code>,那个属性是retain,所以retain count == 1。
你正在处理你的 dealloc 中的那个 1。<br/>
根据您的评论:</p>

<blockquote>
<p>// Balance out pushViewController&#39;s retain.</p>
</blockquote>

<p>你不<code>Balance</code>那些,你只平衡一个<code>你拥有的</code>。如果系统对您的对象进行保留,当系统不再需要它们时,它会释放它们。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - 对象 dealloc 仅在 iOS 4.3 中崩溃,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/8638836/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/8638836/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - 对象 dealloc 仅在 iOS 4.3 中崩溃