• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iOS - 执行期间的对象释放

[复制链接]
菜鸟教程小白 发表于 2022-12-12 18:56:50 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

例如,考虑以下片段 -

@interface ExampleObject

- doSomething;

@end


@interface StrongCaller
@property ExampleObject *strong;
@end

@implementation StrongCaller


- initWithExampleInstanceExampleObject *) example
{
    _strong = example;
}

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

@end

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

@implementation WeakCaller

- initWithExampleInstanceExampleObject *) example
{
    _weak = example;
}    

- doSomething
{
    ....
    [weak doSomething];
    ....
}

@end

现在,在主线程中,

ExampleObject *object = [[ExampleObject alloc] init];

在线程 1 中,

[[StrongCaller initWithExampleInstancebject] doSomething];

在线程 2 中,

[[WeakCaller initWithExampleInstancebject] doSomething];

假设主线程不再持有对对象的引用,如果 strong 设置为 nil,当 [weak doSomething] 正在执行时会发生什么?在这种情况下对象是否被 GC?



Best Answer-推荐答案


此问题通常发生在异步 block 执行期间,因为无法通过更改逻辑来避免此问题。

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

- (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 
}

关于iOS - 执行期间的对象释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21855003/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap