随笔分类 - OC
摘要:一、继承 不恰当的使用继承导致的最大的一个特征就是高耦合。 是否使用继承需要考虑三个点: 父类只是给子类提供服务,并不涉及子类的业务逻辑 层级关系明显,功能划分清晰,父类和子类各做各的。 父类的所有变化,都需要在子类中体现,也就是说此时耦合已经成为需求 万不得已不要用继承,优先考虑组合等方式。 如果
阅读全文
摘要:一、构建步骤创建一个动态库 MyDynamicFramework创建一个测试类在 MyDynamicFramework.h(默认生成,可统一暴露头文件) 中 #import "Person.h"#import //! Project version number for MyDynamicFramework.FOUNDATION_EXPORT double MyDynamicFrameworkVe...
阅读全文
摘要:一、单例介绍单例:该类在程序运行期间有且仅有一个实例。1.1 单例模式的要点该类有且只有一个实例;该类必须能够自行创建这个实例;该类必须能够自行向整个系统提供这个实例。1.2 单例的主要优点单例可以保证系统中该类有且仅有一个实例,确保所有对象都访问这个唯一实例;因为类控制了实例化过程,所以类可以灵活更改实例化过程;基于第 1 条,对于项目中的个别场景的传值、存储状态等业务更加方便;可以节约系统资源...
阅读全文
摘要:一、iOS 系统架构层次 在 iOS 中,框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其他资源。共享资源库定义应用程序可以调用的函数和方法。 iOS 为应用程序开发提供了许多可使用的框架,并构成 iOS 操作系统的层次架构,分为四层: Cocoa To
阅读全文
摘要:一、前言一般可以将编程语言分为两种,编译语言和直译式语言。像 C++、Objective-C 都是编译语言。编译语言在执行的时候,必须先通过编译器生成机器码,机器码可以直接在 CPU 上执行,所以执行效率较高。像 JavaScript、Python 都是直译式语言。直译式语言不需要经过编译的过程,而是在执行的时候通过一个中间的解释器将代码解释为 CPU 可以执行的代码。所以,较编译语言来说,直译式...
阅读全文
摘要:Objective C 中的 Category 是对装饰模式的一种具体实现。它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法。 分类可以拓展类的属性、方法、协议等信息 一、使用场景 根据苹果官方文档对 Category 的描述,它的使用场景主要有三个: 1. 给现有的类添加方法; 2
阅读全文
摘要:你不需要自己创建 CTRun。CoreText 将根据 NSAttributedString 的属性来自动创建 CTRun。每个 CTRun 对象对应不同的属性,正因此,你可以自由的控制字体、颜色、字间距等等信息。通常步聚:使用 core text 就是先有一个要显示的 string然后定义这个 string 每个部分的样式 attributedString生成 CTFramesetter得到 C...
阅读全文
摘要:一、介绍在 MacOS 和 iOS 上,可执行程序的启动依赖于 xnu 内核进程运作和动态链接加载器 dyld。dyld 全称 the dynamic link editor,即动态链接器,其本质是 Mach-O 文件,是专门用来加载动态库的库。源码下载地址:https://opensource.apple.com/tarballs/dyld/当点击 App 的时候,系统在内核态完成一些必要配置,...
阅读全文
摘要:一、什么是闭包在 wikipedia 上,闭包的定义是:In programming languages, a closure is a function or reference to a function together with a referencing environment—a table storing a reference to each of the non-local va...
阅读全文
摘要:一、前言苹果在 WWDC2015 大会上引入了 bitcode,随后在 Xcode7 中添加了在二进制中嵌入 bitcode(Enable Bitcode) 的功能,并且默认设置为开启状态。在What is app thinning? (iOS, tvOS, watchOS)一节中有以下定义:Bitcode is an intermediate representation of a comp...
阅读全文
摘要:一、什么是自动释放池OC 中的一种内存自动回收机制,它可以延迟加入 AutoreleasePool 中的变量 release 的时机,即当我们创建了一个对象,并把它加入到了自动释放池中时,它不会立即被释放,会等到一次 runloop 结束或者作用域超出 {} 或者超出 [pool release] 之后再被释放。二、自动释放池的创建与销毁时机MRC:NSAutoreleasePool * pool...
阅读全文
摘要:atomic在set方法里加了锁,防止了多线程一直去写这个property,造成难以预计的数值。当属性使用atomic修饰时,它的读和写是原子性的:当线程A进行写操作,这时其他线程的读或者写操作会因为该操作而等待。当A线程的写操作结束后,B线程进行写操作,然后当A线程需要读操作时,获得了在B线程中修改的值。如果有C线程在A线程读操作之前release 了该属...
阅读全文
摘要:一、ARC ARC 的想法来源于苹果在早期设计 Xcode 的 Analyzer 的时候,发现编译器在编译时可以帮助大家发现很多内存管理中的问题。后来苹果修改了一些内存管理代码的书写方式,干脆编译器在编译时把内存管理的代码都自动补上。 ARC 是编译器特性,而不是运行时特性,更不是垃圾回收器(GC)
阅读全文
摘要:当前 iOS App 的编译打包方式是把适配兼容多个设备的执行文件及资源文件合并一个文件,上传和下载的文件则包含了所有的这些文件,导致占用较多的存储空间。 App Thinning 是一个关于 的功能,它可以让 App Store 和操作系统在安装、更新及运行 iOS 或者 watchOS 的 Ap
阅读全文
摘要:一、简介 依赖注入可以通过初始化方法(或构造函数)传递所需要的参数,或者通过属性(setter)传递。这里将对这两种方法进行讲解。 初始化方法注入: 属性注入: 一般更趋向于初始化注入,如果在初始化(构造函数)的时候没办法进行注入,才通过属性进行注入。在通过初始化注入的情况下,这些依赖可能仍然需要作
阅读全文
摘要:一、Off Screen Rendering 离屏渲染,指的是 GPU 在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。 离屏渲染的数量才是影响 app 交互性能的根源。 离屏渲染耗时是发生在离屏这个动作上面,而不是渲染。原因主要在于创建缓冲区和上下文切换。创建新的缓冲区代价都不算大,付出最大代价
阅读全文
摘要:APP 启动到执行 main 函数之前,程序就执行了很多代码。 执行顺序: 1. 将程序依赖的动态链接库加载到内存 2. 加载可执行文件中的所有符号,代码 runtime 解析被编译的符号代码 3. 遍历所有的 class 4. 按继承层级一次调用 Class 的 load 和 category 的
阅读全文
摘要:MRC 环境下: id 变量赋值给 void * 变量运行时不会有问题。 void * 变量赋值给 id 变量并调用其实例方法,运行时也不会有问题。 ARC 环境下: 直接赋值报错 系统给出解决方案: __bridge id 变量赋值给 void * 变量时的__bridge 与 __unsafe_
阅读全文
摘要:MRC 环境下(Targets -> Setting -> Objective-C Automatic Reference Counting = NO): id 变量赋值给 void * 变量运行时不会有问题。 id obj1 = [NSObject new];void * p = obj1; vo
阅读全文

浙公网安备 33010602011771号