随笔分类 - iOS-A底层分析
摘要:Block循环引用 什么情况下block会造成循环引用 ARC 情况下 block为了保证代码块内部对象不被提前释放,会对block中的对象进行强引用,就相当于持有了其中的对象,而如果此时block中的对象又持有了该block,就会造成循环引用。 常见误区 误区一.所有block都会造成循环引用 在
阅读全文
摘要:什么时候需要对变量使用__block? __block可以用于解决block内部无法修改auto变量值的问题。__block不能修饰全局变量、静态变量(static)。 __block用来赋值场景(对象类型)(使用场景修改auto变量值) //赋值场景 NSMutableArray *__block
阅读全文
摘要:iOS-block用什么修饰符来修饰?为什么用copy来修饰呢?用strong来修饰可以吗? 在ARC下 block 可以用copy 或者 strong来修饰。 为什么用copy来修饰? 因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到
阅读全文
摘要:Block有三种类型:__NSGlobalBlock,__NSStackBlock,__NSMallocBlock 问题:Block有几种类型呢?这几种类型分别在什么情况下出现?我们思考一下,__NSStackBlock在访问外部变量时,会有什么问题? 我们在讲block的本质的时候已经知道了,bl
阅读全文
摘要:上一篇我们讲到了Block是如何捕获基本数据类型的,今天我们研究一下block是如何捕获对象类型的数据. 我们用一个小问题开始本篇的主题:在ARC环境下,我们先创建一个Person类,再重写Person类的dealloc方法,然后看下面代码 当我们的代码走到断点的时候,Person被销毁了,这很容易
阅读全文
摘要:Block如何捕获外部变量一:基本数据类型 共有三种:auto变量 、static变量、全局变量 这一篇,我们详细讲解Block捕获外部变量的机制.我们把block捕获外部基本数据类型变量的情况分为以下几种,见下图: 一:auto变量 auto变量:自动变量,离开作用域就会销毁,一般我们创建的局部变
阅读全文
摘要:一: block的原理是怎样的?本质是什么? block本质上也是一个OC对象,因为它的内部也有个isa指针 block是封装了函数调用以及函数调用环境的OC对象 接下来我们将通过底层源码来论证上诉两点. 首先我们写一个简单的block,通过clang编译器编译成C++代码,查看一下block的底层
阅读全文
摘要:一、最简单的block 1、最简单的block结构 ^{ NSLog(@"this is a block"); NSLog(@"this is a block"); NSLog(@"this is a block"); }; 2、block的调用 ^{ NSLog(@"this is a block
阅读全文
摘要:Objective-C 有两个神奇的方法:+load 和 +initialize,这两个方法在类被使用时会自动调用。但是两个方法的不同点会导致应用层面上性能的显著差异。 一、+ initialize 方法和+load 调用时机 先来看一个表 方法+(void)load+(void)initializ
阅读全文
摘要:Category的实现原理 Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息 在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中) Category和Class Extension的区
阅读全文
摘要:1、什么是内存对齐 还是用一个例子带出这个问题,看下面的小程序,理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占4+1=5byte;但是实际上,通过运行程序得到的结果是8 byte,这就是内存对齐所导致的。 //32位系统 #include<stdi
阅读全文
摘要:KVC的全称是Key-Value Coding,即“键值编码”,可以通过指定的key来访问相应的对象属性。 常见的API有: (void)setValue:(id)value forKeyPath:(NSString *)keyPath; (void)setValue:(id)value forKe
阅读全文
摘要:KVO全称为Key-Value Observing, 即键值监听,用于指定对象属性值的改变。 问题一、iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类 当修改instance对象的属性时,
阅读全文
摘要:实例对象( instance)、类对象(class)、元类对象(meta-class)的内部结构分析 本文使用的objc源码版本为objc4-756.2。 Class本质上为一个结构体类型: typedef struct objc_class *Class; 实例对象的定义 struct objc_
阅读全文
摘要:isa指针 instance对象的isa指向class对象,当调用对象方法时,通过instance对象的isa找到class,最后找到对象方法的实现进行调用。 class对象的isa指向meta-class,当调用类方法时,通过class对象的isa找到meta-class,最后找到类方法的实现进行
阅读全文
摘要:weak 关键字的运用在 iOS 当中属于基础知识,在面试的时候问 weak 的用处,就像两个 iOS 程序员见面寒暄问候一样普通了。 weak 的常见场景是在 delegate,block,NSTimer 中使用,以避免循环引用所带来的内存泄漏,这是教科书式的用法。 以下是一些有趣的应用。 wea
阅读全文
摘要:weak和assign区别 经常会有面试题问weak和assign的区别,这里介绍一下。 weak和strong是对应的,一个是强引用,一个是弱引用。weak和assign的区别主要是体现在两者修饰OC对象时的差异。上面也介绍过,assign通常用来修饰基本数据类型,如int、float、BOOL等
阅读全文
摘要:类属性 (Objective-C Class Properties) 官方解释 先看下它在Xcode8 release版本中官方给出的解释: Objective-C now supports class properties, which interoperate with Swift type p
阅读全文
摘要:前言 这里面你将会了解到什么是优先级翻转、自旋锁、互斥锁。 绝大部分 Objective-C 程序员使用属性时,都不太关注一个特殊的修饰前缀,一般都无脑的使用其非默认缺省的状态,他就是 atomic。 1 @interface PropertyClass 2 3 @property (atomic,
阅读全文
摘要:@property修饰符种类 当我们定义一个字符串属性时,通常我们会这样写: @property (nonatomic, copy) NSString *name; 复制代码 当我们定义一个NSMutableArray类型的属性时,通常我们会这样写: @property (nonatomic, st
阅读全文