摘要: 做过OC与swift混编的都知道,若实现swift调用OC的方法或OC调用swift方法,需要建立一个桥接文件,例如命名:MyBridging.h,在Build Settings中添加配置Swift Compiler - General中的Objective-C Bridging Header:My 阅读全文
posted @ 2021-08-18 17:56 zbblogs 阅读(1490) 评论(0) 推荐(0) 编辑
摘要: 我们知道swift中的数组类型为Array<Element>,它用于存储不同类型的元素,并且它是一个结构体struct,因此它是一个值类型,拥有写时拷贝特性。apple为我们提供了ManagedBuffer,用于存储不同类型的元素到缓冲区指针中,因此我们可以通过ManagedBuffer自己实现一个 阅读全文
posted @ 2021-08-16 15:57 zbblogs 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 我们知道swift值类型的变量在赋值操作后会放生深拷贝,即:赋值拷贝,而class类型的变量只会浅拷贝。我们看一个例子: class MyClass { var list: [Int] init(_ list: [Int]) { self.list = list } } struct MyStruc 阅读全文
posted @ 2021-08-13 18:36 zbblogs 阅读(457) 评论(0) 推荐(0) 编辑
摘要: isKnownUniquelyReferenced:用于判断一个AnyObject实例是否只存在唯一的强引用 class MyClass {} 判断MyClass实例存在唯一的强引用的例子: var cls = MyClass() if isKnownUniquelyReferenced(&cls) 阅读全文
posted @ 2021-08-13 16:49 zbblogs 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 在讲解指针之前,我们先来了解一下内存布局,计算机中的内存都是以字节为单位存储的,但是大部分处理器并不是按字节块来存取内存的。它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度。所以我们需要通过一种内存对齐方式来存取,这样一方面可以节省内存, 阅读全文
posted @ 2021-08-13 16:34 zbblogs 阅读(585) 评论(0) 推荐(0) 编辑
摘要: Combine 是 Apple 对函数响应式编程库的实现,类似于RxSwift,它实现了大部分的RxSwift中的功能,但也存在一部分没有实现的功能,这里有一个Combine与RxSwift功能对照表,点击查看。Combine是SwiftUI的核心库,SwiftUI中的大部分属性包装器,例如@Sta 阅读全文
posted @ 2021-08-09 19:01 zbblogs 阅读(2530) 评论(0) 推荐(0) 编辑
摘要: 泛型:实质上就是不使用具体数据类型(例如 int、double、float 等),而是使用一种通用类型来进行程序设计的方法,该方法可以大规模的减少程序代码的编写量,让程序员可以集中精力用于业务逻辑的实现。 在OC中泛型通常用于以下情况: class MyContainer<T> { private 阅读全文
posted @ 2021-06-24 20:10 zbblogs 阅读(482) 评论(0) 推荐(0) 编辑
摘要: 用过SwiftUI开发页面的同学,对@State的使用非常常见,它是用来监控属性值的变化,并通知SwiftUI更新页面的。 之前的文章中我已经介绍过@propertyWrapper的简单运用,不知道的同学,可以点击查看。 结合@propertyWrapper的运用,我们可以推断@State的实现原理 阅读全文
posted @ 2021-06-23 16:54 zbblogs 阅读(761) 评论(0) 推荐(0) 编辑
摘要: @propertyWrapper(属性包装器) 在swiftUI中大量使用了属性包装器,用来监控数据变化,从而更新UI的@State包装器等等。 通过@propertyWrapper注解,我们也可以实现自定义的属性包装,它可以应用在class、struct、enum类型上,下面我们通过struct来 阅读全文
posted @ 2021-06-22 20:20 zbblogs 阅读(805) 评论(0) 推荐(0) 编辑
摘要: @dynamicCallable与callAsFunction都是可以通过类型实例作为函数调用的实现方法。 @dynamicCallable实现方式,将此属性应用于类、结构、枚举或协议,以将该类型的实例视为可调用函数,你必须实现dynamicallyCall(withArguments:) 或dyn 阅读全文
posted @ 2021-06-22 17:00 zbblogs 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 在截取字符串时,有时我们需要考虑表情符字符,因为不同的表情符字符长度不一样,例如:😁的长度为2。 NSLog(@"length: %ld", @"😁".length); // 此处输出为:length: 2 NSLog(@"length: %ld", @"👴🏻".length); // 此处 阅读全文
posted @ 2021-06-22 14:43 zbblogs 阅读(423) 评论(0) 推荐(0) 编辑
摘要: 让Xcode在编译时,提示相关如下标记警告: // TODO: 待完成的任务 // FIXME: 带修复的bug // ERROR: 错误信息 1、选中工程项目的target 2、选中Build Phases 3、添加Run Script,脚本内容如下: TAGS="TODO:|FIXME:" ER 阅读全文
posted @ 2021-06-08 16:55 zbblogs 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 到openssl官网下载openssl源码:https://www.openssl.org/source/ 目前我选择的稳定版本为:openssl-1.1.1k 1、编译x86_64平台 首先需要修改Configurations/15-ios.conf配置文件,这个配置文件里面的target是基于1 阅读全文
posted @ 2021-05-07 13:35 zbblogs 阅读(2055) 评论(0) 推荐(0) 编辑
摘要: 有两种方式 1、通过获取绘图上下文,将图片绘制到上下文中,然后从上下文中取出这个图片(优点就是,绘图过程会对图片做优化处理) 2、通过CGDataProviderCopyData( CGDataProviderRef cg_nullable provider)进行解码 说明:[UIImage ima 阅读全文
posted @ 2020-04-21 17:07 zbblogs 阅读(4429) 评论(0) 推荐(0) 编辑
摘要: DBL_EPSILON和 FLT_EPSILON主要用于单精度和双精度的比较当中 我们在对小数比较的时候,经常会出现如下情况: double a = 0.5; if (a == 0.5) //正确 x++; double b = sin(M_PI / 6.0); if (b == 0.5) //错误 阅读全文
posted @ 2020-03-25 16:07 zbblogs 阅读(934) 评论(0) 推荐(0) 编辑