推广

iOS底层原理 16 :底层面试题

iseeyu2年前 (2024-02-21)推广137

3. Runtime是如何实现weak,为什么可以自动置为nil?
  • 通过SideTable找到我们的weak_table
  • weak_table根据referent找到或者创建weak_entry_t
  • 然后append_referrer(entry,referrer)将我的新弱引用的对象加到entry
  • 最后weak_entry_insert 把entry加入到我们的weak_table

4.Associate方法关联的属性,需要手动在delloc里面释放吗?

不需要 ,应为在dealloc的实现里面已经实现
dealloc ->_objc_rootDealloc(self)->obj->rootDealloc()->object_dispose()->objc_destructInstance()

5.Method Swizzling的坑与应用
  1. 首先Method Swizzling方法最好是能够放在+load或+initialize方法里面,保证第一次发送消息之前就已经执行了方法切换的代码
  2. method_exchangeImplementations()方法交换的本质: 交换imp(即方法的实现)
  3. 为避免Method Swizzling出现的各种坑,设计了一下实现代码:
@interface LGRuntimeTool : NSObject
/**
 交换方法
 @param cls 交换对象
 @param oriSEL 原始方法编号
 @param swizzledSEL 交换的方法编号
 */
+ (void)lg_bestMethodSwizzlingWithClass:(Class)cls oriSEL:(SEL)oriSEL swizzledSEL:(SEL)swizzledSEL;

@end
@implementation LGRuntimeTool
+ (void)lg_bestMethodSwizzlingWithClass:(Class)cls oriSEL:(SEL)oriSEL swizzledSEL:(SEL)swizzledSEL{
    
    if (!cls) NSLog(@"传入的交换类不能为空");
    
    Method oriMethod = class_getInstanceMethod(cls, oriSEL);
    Method swiMethod = class_getInstanceMethod(cls, swizzledSEL);
    
    if (!oriMethod) {
        // 在oriMethod为nil时,替换后将swizzledSEL复制一个不做任何事的空实现,代码如下:
        class_addMethod(cls, oriSEL, method_getImplementation(swiMethod), method_getTypeEncoding(swiMethod));
        method_setImplementation(swiMethod, imp_implementationWithBlock(^(id self, SEL _cmd){ }));
    }
    
    // 一般交换方法: 交换自己有的方法 -- 走下面 因为自己有意味添加方法失败
    // 交换自己没有实现的方法:
    //   首先第一步:会先尝试给自己添加要交换的方法 :personInstanceMethod (SEL) -> swiMethod(IMP)
    //   然后再将父类的IMP给swizzle  personInstanceMethod(imp) -> swizzledSEL
    //oriSEL:personInstanceMethod

    BOOL didAddMethod = class_addMethod(cls, oriSEL, method_getImplementation(swiMethod), method_getTypeEncoding(swiMethod));
    if (didAddMethod) {
        class_replaceMethod(cls, swizzledSEL, method_getImplementation(oriMethod), method_getTypeEncoding(oriMethod));
    }else{
        method_exchangeImplementations(oriMethod, swiMethod);
    }
    
}
+ (void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [LGRuntimeTool lg_bestMethodSwizzlingWithClass:self oriSEL:@selector(helloword) swizzledSEL:@selector(lg_studentInstanceMethod)];
    });
}

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56790.html

相关文章

要想确保seo优化项目进展顺利,SWOT自我分析为您寻找优化指南针。

要想确保seo优化项目进展顺利,SWOT自我分析为您寻找优化指南针。

如果你刚进入SEO行业就开始独立运营一个SEO项目,起初很多人都是盲目的,不知道从哪里开始,你花了很多时间来思考这个问题,很幸运的是,现代的企业管理,总会让你找到一条路,比如:SWOT分析会给你一幅清晰的肖像会帮助你找到自己的路。 SWOT是什么意思? 简单理解,从SEO的角度来看,...

淘宝个人店交税吗(个人在淘宝开店要交税吗)

淘宝个人店交税吗(个人在淘宝开店要交税吗)

根据规定,淘宝个人店铺也是要交税的,不过,如果个人店铺的营业额比较低,是可以免受税收的。至于多少以下免税收,每个地方的规定是不一样的,大家还是要去当地相关部门咨询。...

seo公司如何借助百度资源平台获取网站早排名的权益。

seo公司如何借助百度资源平台获取网站早排名的权益。

在做SEO优化的过程中,长期以来,大多数站长可能处于“自娱自乐”的状态,总是习惯性地根据自己的实战思维来评价自己网站的状态。这不是一个问题,但我们往往忽略了百度搜索引擎的一些优化标准。事实上,如果我们稍加注意,可以说我们的优化工作非常强大,尤其是在提交数据资源时。那么,SEO人员提交数据到搜索资源...

做好SEO提高网站排名以及销售利润。

做好SEO提高网站排名以及销售利润。

做好SEO提高网站排名以及销售利润 任何SEO活动的最终目标是推动你的事业前进;策略看起来超越排名将提高销售、利润和整体品牌。 人们很容易认为SEO是所有关于驾驶交通到您的网站的搜索引擎排名,通过改进。但是,这只是达到目的的一种手段。每一个企业网站的最终目标是帮助公司赚更多的钱,而那是有效的,你...

小编分享全网推广从哪里入手。

小编分享全网推广从哪里入手。

网站想要在互联网中立足,不被淹没在信海量的信息中,初期的运营优化工作非常重要了。特别是新建设好的网站,刚上线,还在考核期,不能只顾着更新网站内容,还需要做一些seo优化工作的。不过要注意优化技巧,切忌过度优化,那么全网推广运营应该从哪方面做起呢? 1.定期更新网站 不要只顾着建设网站,...

淘宝竞品的意思是什么(竞品店铺什么意思)

淘宝竞品的意思是什么(竞品店铺什么意思)

竞品是淘宝里店主主打的一个产品。有一个最大的好处就是,让在运营的过程中,数据目标制定,更加有目标性。竞品的很多数据可以在生意参谋上看到,不限于淘宝点击率、转化率等。...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片