菜鸟教程小白 发表于 2022-12-12 18:56:50

iOS - 执行期间的对象释放


                                            <p><p>Apple 的开发人员引用中提到,如果一个对象没有强引用,则该对象将被释放。如果从弱引用调用的实例方法正在执行中,会发生这种情况吗?</p>

<p>例如,考虑以下片段 - </p>

<pre><code>@interface ExampleObject

- doSomething;

@end


@interface StrongCaller
@property ExampleObject *strong;
@end

@implementation StrongCaller


- initWithExampleInstance:(ExampleObject *) example
{
    _strong = example;
}

- doSomething
{
    ....
    ;
    ....
    strong = nil;
    ....
}

@end

@interface WeakCaller
@property (weak) ExampleObject *weak;
@end

@implementation WeakCaller

- initWithExampleInstance:(ExampleObject *) example
{
    _weak = example;
}   

- doSomething
{
    ....
    ;
    ....
}

@end
</code></pre>

<p>现在,在主线程中,</p>

<pre><code>ExampleObject *object = [ init];
</code></pre>

<p>在线程 1 中,</p>

<pre><code>[ doSomething];
</code></pre>

<p>在线程 2 中,</p>

<pre><code>[ doSomething];
</code></pre>

<p>假设主线程不再持有对对象的引用,如果 strong 设置为 nil,当 正在执行时会发生什么?在这种情况下对象是否被 GC?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>此问题通常发生在异步 block 执行期间,因为无法通过更改逻辑来避免此问题。</p>

<p>但是,如果您确定不想更改逻辑,则可以在您的情况下使用相同的解决方案。你应该这样修改你的方法</p>

<pre><code>- (void) doSomething
{
    Your_Class *pointer = self; //Now this local variable keeps strong reference to self
    if(pointer != nil){// self is not deallocated
      ... your code here
    }
    //Here pointer will be deleted and strong reference will be released automatically
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于iOS - 执行期间的对象释放,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/21855003/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/21855003/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iOS - 执行期间的对象释放