首页 > 其他分享 >iOS面试题-load 和 initlize的区别

iOS面试题-load 和 initlize的区别

时间:2024-07-22 15:44:00浏览次数:17  
标签:load 面试题 调用 子类 initlize initialize 线程 方法

+load+initialize是两个与类的加载和初始化相关的特殊方法。它们在类的生命周期中的作用和调用时机有明显的区别。

+load 方法

  • 调用时机:+load在类初始加载进内存时调用,这通常发生在程序启动的时候,所有类和分类(Category)的+load方法在应用程序的生命周期中只会被调用一次。
  • 调用顺序:首先调用类的+load方法,然后调用分类的+load方法。如果有多个分类都实现了+load方法,它们的调用顺序是不确定的。
  • 继承性:+load方法不会被自动继承,即使子类没有实现+load方法,父类的+load方法也会被调用。如果子类实现了+load方法,那么父类和子类的+load方法都会被调用。
  • 线程安全:+load方法是线程安全的,Objective-C运行时保证+load方法在多线程环境下安全执行。
  • 使用场景:+load通常用于设置全局状态、注册类、交换方法实现(Method Swizzling)等,不建议在+load中进行耗时操作,因为它会影响应用启动时间。

+initialize 方法

  • 调用时机:+initialize在类或其子类的第一个方法被调用之前调用,它是懒加载的,只有在类实际被使用时才会被调用。
  • 调用顺序:如果子类没有实现+initialize方法,那么在子类的第一个方法被调用之前,父类的+initialize方法会被调用。如果子类实现了+initialize方法,那么父类的方法不会被调用,除非子类的+initialize方法中显式调用了[super initialize]
  • 继承性:+initialize方法会被自动继承,如果子类没有提供+initialize的实现,那么会调用父类的实现。
  • 线程安全:+initialize方法也是线程安全的,Objective-C运行时保证+initialize方法在多线程环境下安全执行,并且在每个类中只会被调用一次。
  • 使用场景:+initialize适合用于执行类的懒初始化,如初始化全局变量、修改静态数据结构等。

注意事项

  • 避免在+load+initialize中编写复杂或耗时的初始化代码,这可能会影响应用的启动性能。
  • +load+initialize都不应该依赖于其他类的初始化代码,因为无法保证其他类的初始化顺序。
  • 如果在+initialize中使用了多线程,要特别注意线程安全和死锁问题,尽管+initialize本身是线程安全的。
  • +initialize中访问静态变量时,如果这些变量在其他地方被修改,需要注意同步问题。

其他

既然说这两个是特殊方法,那么有哪些非特殊的方法呢:

  1. 实例方法
    -init: 实例的初始化方法,通常在创建对象后手动调用或在构造器中调用。
    -dealloc: 实例被释放时调用的方法,用于执行清理工作。
    -description: 返回对象描述的字符串,通常用于调试。
    以及其他自定义的实例方法,用于执行对象的具体行为。
  2. 类方法
    +new: 类方法,用于创建类的新实例,它会调用alloc和init。
    +someClassMethod: 自定义的类方法,用于执行与类相关的操作,而不是与特定实例相关的操作。

标签:load,面试题,调用,子类,initlize,initialize,线程,方法
From: https://www.cnblogs.com/jianqiu/p/18315984

相关文章

  • Day07 MySQL 面试题 (三)
    MySQL面试题22、MySQL里记录货币用什么字段类型好NUMERIC和DECIMAL类型被MySQL实现为同样的类型,这在SQL92标准允许。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定。例......
  • 易优CMS模板标签downloadpay下载付费
    [基础用法]标签:downloadpay描述:下载模型实现付费,会员专享,会员付费下载,在使用之前先频道模型->下载模型->编辑->开启下载付费使用方法:付费标签需要加载/template/pc/system/download_pay.htm模板文件下载地址:点击下载,该文件放在pc模板目录......
  • Android笔试面试题AI答之控件Views(3)
    答案仅供参考,来自文心一言目录1.如何在ListView间添加分割线?方法1:在XML布局文件中设置方法2:在Java代码中设置注意事项2.如何实现ListView的逐行显示?1.使用`Handler`和`postDelayed()`方法2.监听滚动事件3.自定义Adapter4.使用`RecyclerView`代替`ListVie......
  • 模型需要永远加载[tf.keras.models.load_model]
    我试图在VisualStudio代码上本地加载模型,但是当我运行脚本时,它卡在加载模型行。我已经使用cpu在googlecollab上成功运行了脚本,所以我不认为这是计算能力不足的原因,并且在运行脚本时,我的cpu仅使用25%的容量。有人知道为什么会发生这种情况吗?model=tf.keras.models......
  • MySQL InnoDB事务隔离和并发控制面试题详解
    1.为什么MySQL使用B+树作为索引而不是B树?MySQL选择使用B+树作为索引主要有以下几个原因:减少IO次数,提高效率:B+树的所有数据都存储在叶子节点,非叶子节点只存储索引,树的高度较低,因此查找路径较短,减少了磁盘IO次数。查询效率更加稳定:由于数据仅存储在叶子节......
  • Java基础面试题大全 -001
    1、Java语言有哪些特点1、简单易学、有丰富的类库2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高)3、与平台无关性(JVM是Java跨平台使用的根本)4、可靠安全5、支持多线程6、java生态完善2、面向对象和面向过程的区别面向过程:是分析解决问题的步骤,然后用函数......
  • 代码随想录训练营 Day4打卡 链表part02 24. 两两交换链表中的节点 19.删除链表的倒数
    代码随想录训练营Day4打卡链表part02一、力扣24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]算法思路:引入虚......
  • 解决: Cannot load information for github.com
    问题在共享项目至idea时候出现:IamgettingthiserrorwhilesharingonGithHubinIntellijeIDEA:Cannotloadinformationforgithub.com/:Requestresponse:Accesstothissitehasbeenrestricted.Ifyoubelievethisisanerror,pleasecontacthttps://suppor......
  • 记录 OpenWrt 执行 opkg update 命令报错 Failed to download,但是换源无效且源用浏览
    记录OpenWrt执行opkgupdate命令报错Failedtodownload,但是换源无效且源用浏览器可访问的解决方案解决方法首先给出解决方法:)网络-->接口-->WAN-->编辑-->高级设置取消勾选“自动获取DNS服务器”-->在使用自定义的DNS服务器一栏中添加并输入可用的DNS地址。......
  • 易优CMS模板标签load文件加载导入外部的css样式文件
    【基础用法】标签:load描述:资源文件加载,比如:css/js用法:{eyou:loadhref='/static/js/common.js'ver='on'/}属性:file=''资源文件路径href=''远程资源文件URLver=''开启版本号自动刷新浏览器缓存涉及表字段:无【更多示例】-------------------------------示例1------......