首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

译文: 低调奢华有内涵的「Runtime」

而我们在November Five(译者:一家公司名)也一直尝试使用各种强悍的工具,让事情变得更美好。这里有一些我们过去使用Runtime的真实例子。...使用关联对象(Working with associated objects) 有时候你会有这样的需求:要在一个类的category添加一个属性,不幸的是,在Objective-C是不能这样干的(译者:...幸运的是,你有associated objects,它允许你在「运行时」将任意值和某个对象关联起来。假设你要创建一个UIImageView的category,用于下载图片。...感谢Objective-C的Runtime,我们可以在「运行时」为这个对象添加缺失的方法(方法的实现为),这样就可以防止这个崩溃了。...有人可能不知道,JSONModel允许你轻松地JSON创建数据模型。实现原理是:Objective-C的Runtime,会在「运行时」读取对象的属性,并填充JSON获取的值。

95640
您找到你想要的搜索结果了吗?
是的
没有找到

iOS系统源码思考:对象的引用计数存储在哪里?--runtime源码得到的启示

核心问题 iOS开发者都知道OC里面的内存管理是通过对象的引用计数来管理的,或手动MRC,或自动ARC,有些操作可以让引用计数加1,有些可以减1,一旦一个对象的引用计数为0,就回收内存了。...1 表示 isa_t 开启了指针优化,不能直接访问 objc_object 的 isa 成员变量 (因为 isa 已经不是一个合法的内存指针了,而是一个 Tagged Pointer ),其名字 nonpointer...3.3 isa_t联合体里面的宏 SUPPORT_PACKED_ISA 表示平台是否支持在 isa 指针中插入除 Class 之外的信息。...=1 to enable tagged pointer objects // Be sure to edit tagged pointer SPI in objc-internal.h as well....第三个 bit 开始才是存储引用计数数值的地方。

5.9K20

新年新语言,WCDB Swift

WCDB ObjC 版本的实现中,由于引入了 C++ 代码,并不能直接 bridge 到 Swift。因此,我们 9 月份开始就着手使用原生的 Swift,重写 WCDB。...通过建立 Swift 类型与数据库表之间的映射关系,使得开发者可以通过类对象直接操作数据库。...称之为强迫症也好,代码洁癖也罢,Swift with Cocoa 总让人心里有那么一丝别扭。因此,我们决定寻找 Swift 原生的解决方案。 WCDB 的模型绑定对语言有两点依赖: 1....ObjC 版本使用的指针,使得 WCDB 可以获取变量的值,并插入到数据库中,或数据库中获取数据写入到变量。 2. 数据库字段的映射。...Swift 也有一个相关的 SR 在讨论这个问题。 显然,我们不可能等待这个特性实现了再去做 WCDB Swift。因此我们尝试使用“不常规”的方法,获取到对应的 property 名称。

97890

新年新语言,WCDB Swift

且与 ObjC 版保持完全一致的功能。 模型绑定 WCDB Swift 的模型绑定,基于 Swift 4.0 的 Codable 协议实现。...通过建立 Swift 类型与数据库表之间的映射关系,使得开发者可以通过类对象直接操作数据库。...称之为强迫症也好,代码洁癖也罢,Swift with Cocoa 总让人心里有那么一丝别扭。因此,我们决定寻找 Swift 原生的解决方案。 WCDB 的模型绑定对语言有两点依赖: 1....ObjC 版本使用 selector 的 IMP 指针,使得 WCDB 可以获取变量的值,并插入到数据库中,或数据库中获取数据写入到变量。 2. 数据库字段的映射。...因此我们尝试使用“不常规”的方法,获取到 KeyPath 对应的 property 名称。 Mirror 是 Swift 里的反射类型,它可以遍历每个变量,获取其名称和值,但不能对变量写入数据。

2.2K80

iOS_Swift函数派发机制

1.Swift 函数派发类型 图片 派发效率从高到底:Static dispatch > Table dispatch > Message dispatch 1.1 static dispatch...子类新增函数会被插到这个数组的最后,没有位置可以让 extension 安全的插入函数。...不只可以通过 swizzling 来改变,甚至可以用 isa-swizzling 修改对象继承关系,可以在面向对象基础上实现自定义派发 确定:速度最慢 ---- 2.派发类型识别 2.1 Struct...2.5 Protocol 对象 无论真实对象是值类型还是引用类型,都使用 Table dispatch ---- 2.6 修饰符 2.6.1 @objc/@nonobjc: @objc/@nonobjc...@objc:是将是 swift 中 继承自 NSObject 类的函数暴露给 OC。原理:生成两个函数引用,一个给 swift 调用,一个给 objc 调用。

24820

iOS_Swift函数派发机制

1.Swift 函数派发类型 图片 派发效率从高到底:Static dispatch > Table dispatch > Message dispatch 1.1 static dispatch...子类新增函数会被插到这个数组的最后,没有位置可以让 extension 安全的插入函数。...不只可以通过 swizzling 来改变,甚至可以用 isa-swizzling 修改对象继承关系,可以在面向对象基础上实现自定义派发 确定:速度最慢 ---- 2.派发类型识别 2.1 Struct...2.5 Protocol 对象 无论真实对象是值类型还是引用类型,都使用 Table dispatch ---- 2.6 修饰符 2.6.1 @objc/@nonobjc: @objc/@nonobjc...@objc:是将是 swift 中 继承自 NSObject 类的函数暴露给 OC。原理:生成两个函数引用,一个给 swift 调用,一个给 objc 调用。

16610

Swift学习总结

18、swift任何类型都可以用可类型来说明一个实例可能是nil,而objc-c只允许对象是nil 19、声明实例变量时,在类型后跟随问号?,则表示该变量是可类型,可以为nil,也可以赋了值。...类型可以持有任何类型的值——对象和非对象都可以。...所有类型都支持协议,枚举,结构,类都可以符合协议 与objc一样,可以符合多个协议 与objc不一样的地方是,swift的协议支持继承,还可有多继承。...之前提过协议是支持继承,且多继承,在实践过程中,我们给一个协议A补充另外一个协议B继承,这个时候我们发现我们已经有多个实现是符合A协议的,正常情况,需要我们在每个实现中补充B协议的实现。...三种语法 3、ObjC中的 #pragma mark 用 #MARK替代 4、ObjeC中有id表示任意对象Swift中AnyObject 可以代表任何 class 类型的实例,Any 可以表示任意类型

3K20

Swift基础语法

在这个例子中,允许的最大尝试登录次数被声明为一个常量,因为这个值不会改变。当前尝试登录次数被声明为一个变量,因为每次尝试登录失败的时候都需要增加这个值。...你可以更改现有的变量值为其他同类型的值,在下面的例子中,friendlyWelcome的值”Hello!”改为了”Bonjour!”: [objc] view plain copy print?...尝试这样做会导致编译时报错: [objc] view plain copy print?...终止注释时先插入第二个注释块的终止标记,然后再插入第一个注释块的终止标记: / 这是第一个多行注释的开头 / 这是第二个被嵌套的多行注释 / 这是第一个多行注释的结尾 / 通过运用嵌套多行注释,你可以快速方便的注释掉一大段代码...下面的例子使用toInt方法来尝试将一个String转换成Int: [objc] view plain copy print?

1.4K60

Swift基础语法(四)

OptionalProtocol { @objc optional func protocolMethod1() @objc optional func protocolMethod2...() } 3,用weak修饰delegate属性时,协议前要用@objc声明 @objc protocol ViewControllerDelegate { func protocolMethod1...源文件:单个Swift源代码文件。注意,模块是包含源代码的。 访问权限 访问权限大到小依次为: open:允许实体被定义模块中的任意源文件访问,也可以被另一模块的源文件通过导入该定义模块来访问。...Swift项目中调用Objective-C 1,新建一个Swift的iOS项目 2,创建一个OC的类,此时会有如下提示,选择Create Bridging Header: ?...Swift中的类名的完整形式是:“命名空间+类名”,我们可以尝试在类中打印当前类来查看一下完整名字: class ViewController: UIViewController { override

3.9K20

WWDC22:Runtime 的性能优化和 App 减包

// 使用adrp找到该方法的地址 消耗4字节 adrp x1, [selector "dateFromComponents"] // 将 地址加载到X1寄存器中 消耗4字节 ldr x1...所以可以理解为 把前两步封装一下 所以原来的调用就变成了 bl _objc_msgSend$dateFromComponents 4字节 bl _objc_msgSend 4字节 这也就是苹果说的...在 ARC 下这些都是编译器我们插入的代码,我们无需关心。...// bl _objc_release 消耗4字节 流程为 先执行 mov 把副本地址(X20, 也就是对象的地址)存到寄存器 x0 然后 bl 跳转到 _objc_release...同样执行流程,当执行完 _objc_autoreleaseReturnValue 函数时候我们会获得一个返回地址,这个地址是一个指针,指向了被标记为 Autorelease 的对象

85620

窥探Swift之数组与字典

还是沿袭之前的风格,在介绍Swift中的数组时,我们会对比一下ObjC中的数组和字典,因为ObjC也是iOS开发的主要语言不是。...Swift也不例外,Swift中的数组使用起来还是比较人性化的. 1.数组的声明与创建 在聊Swift中的Array声明创建之前,我想聊一下ObjC中数组的声明与创建,下方是ObjC中不可变数组和可变数组的创建方式...有一点需要注意的是ObjC中的数组只允许往里面存储对象,而不允许往里存储基本数据类型(Int, Float等)。而在Swift中是允许把基本数据类型存入数组中的,如下方代码段所示。...下方的小实例,本质还是对let和var的讨论,下方是Swift实例: ? (2) 插入元素 上面Swift实例中已经展示了如何往数组中插入元素。...Swift中往数组中插入元素和OC中使用的方法是一样的,只是调用方法的方式不同。下方代码就是往可变数组arrayTest中的索引1的位置插入一个值“Objc”。语法比较简单就不做过多的赘述了。

1.9K90

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券