-
Runtime(四):@synthesize与@dynamic
目录 @property @synthesize @dynamic@property在说这两个关键字之前我们先来看下@property关键字创建一个Person类Person.h文件@interface Person : NSObject;@property (nonatomic, assign) int age;@endPerson.m文件#import "Person.h"@implementation Person@end通过指令xcrun -sdk iphoneos clan...…
-
Runtime(三):消息机制
目录 objc_msgSend 消息发送 动态方法解析 消息转发objc_msgSend看下源码#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person * person = [[Person alloc] init]; [person test]; ...…
-
Runtime(二):Class详解
目录 Class的数据结构 Class的数据查看Class的数据结构一、Class的结构二、class_rw_tclass_rw_t里面的 methods、properties、protocols是二维数组,是可读可写的,包含了类的初始内容,分类的内容。三、class_ro_tclass_ro_t里面的baseMethodList、baseProtocols、ivars、baseProperties是一维数组,是只读的包含了类的初始内容。四、method_tmethod_t 是对方法/...…
-
Runtime(一):isa详解
目录 runtime介绍 isa的数据结构 isa的数据查看runtime介绍一、Objective-C是一门动态性比较强的编程语言,跟C/C++等语言有着很大的不同。编程语言都要经过 编码->预编译->编译->链接->运行,几个阶段,C/C++在运行中的实际结果与编译阶段基本相同,而OC可以在运行过程中做许多事情。 OC的动态性表现在如下几个方面: 1、编码阶段调用test方法,实际运行时可能调用的test2方法或者其他类对象的方法。(方法交...…
-
Blocks(五)
目录 循环引用循环引用常见的循环引用的场景@interface Person : NSObject;@property (nonatomic, copy) void(^blk)(void);@endint main(int argc, char * argv[]) { @autoreleasepool { Person * person = [[Person alloc] init]; person.blk = ^{ ...…
-
Blocks(四)
目录 __block修饰符 Block的内存管理 forwarding指针__block修饰符一、为什么在Block内不能修改变量的值typedef void(^blk)(void);int main(int argc, char * argv[]) { @autoreleasepool { int age = 10; Person * person = [[Person alloc] init]; blk b=^(){ ...…
-
Blocks(三)
目录 Block的类型 Block的copy Block访问对象类型的auto变量Block的类型Block的本质是OC对象,那么我们通过下面代码看下它的类及继承关系void(^blk)(void)= ^(void){ };NSLog(@"[blk class]= %@",[blk class]);NSLog(@"[[blk class] superclass]= %@",[[blk class] superclass]);NSLog(@"[[[blk class] super...…
-
Blocks(二)
目录 Block的本质 带参数的Block的本质 局部变量捕获 全局变量访问 Block的底层结构图Block的本质针对以下代码,我们来窥探下block的本质int main(int argc, char * argv[]) { @autoreleasepool { void(^blk)(void)= ^(void){ printf("Block\n"); }; blk(); } r...…
-
Blocks(一)
目录 Blocks概要 Blocks模式Blocks概要带有自动变量(局部变量)的匿名函数。 匿名函数 自动变量Blocks模式一、Block语法完整形式的Block语法与一般的C语言函数定义相比,仅有两点不同。 (1)没有函数名 (2)带有“^”符号语法格式如下: ^ 返回值类型 参数列表 表达式^int(int a, int b){ NSLog(@"a+b=%d",a+b); return a+b;};//block的调用int result = ^int(in...…
-
自动引用计数(测试)
目录 引用计数-代码测试引用计数-代码测试- (void)viewDidLoad { [super viewDidLoad]; [self referencCountTest1]; [self referencCountTest2]; [self referencCountTest3]; [self referencCountTest4]; [self referencCountTest5]; [self ...…
-
自动引用计数(二)
目录 ARC规则 ARC的实现ARC规则一、概要二、内存管理的思考方式引用计数式内存管理的思考方式就是思考ARC所引起的变化。 自己生成的对象,自己所持有 非自己生成的对象,自己也能持有 不再需要自己持有的对象时释放 无法释放非自己持有的对象三、所有权修饰符所谓对象类型就是指向NSObject这样的Objective-C类的指针,例如NSObject * ; id类型用于隐藏对象类型的类名部分,相当于C语言中常用的 void * ; ARC有效时,id类型和对象类型,必须附加...…
-
自动引用计数(一)
目录 什么是自动引用计数 内存管理/引用计数什么是自动引用计数自动引用计数 ARC (Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术。既让编译器来进行内存管理。 在LLVM编译器中设置ARC为有效状态,就无需再次键入retain和release代码了。满足以下条件就无需手工输入retain和release代码了。 Xcode4.2或以上版本 LLVM3.0或以上版本 编译器选项中设置ARC有效内存管理/引用计数一、概要生成对象...…
-
Category
目录 实现原理 +load方法 +initialize方法 关联对象实现原理Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息,在程序运行的时候,runtime将Category的数据,合并到类信息中(类对象、元类对象中)。定义在objc-runtime-new.h中的Category的结构struct category_t { const char *name; classref_t cls; ...…
-
KVC
目录 基本使用 分析基本使用KVC的全称是Key-Value Coding,俗称键值编码,可以通过一个key来访问某个属性。创建一个Person和Cat类 Person.hNS_ASSUME_NONNULL_BEGIN@interface Cat:NSObject@property (nonatomic, assign) float weight;@end@interface Person : NSObject;@property (nonatomic, strong) Cat * ...…
-
KVO
目录 基本使用 分析 NSKVONotifying_Person 补充基本使用KVO的全称是Key-Value Observing,俗称键值监听,可以用于监听某个对象属性值的改变。创建一个Person类@interface Person : NSObject@property (assign, nonatomic) int age;@end使用案例#import "ViewController.h"#import "Person.h"@interface ViewControlle...…
-
NSObject的本质(五) 创建对象
参考文章:OC源码分析之对象的创建 参考文章:Alloc 和 AllocWithZone 区别和联系目录 alloc init alloc与allocWithZoneallocalloc的调用流程图alloc源码分析,参考下面的文章,从源码分析解释了流程调用OC源码分析之对象的创建init和new看下init的源码- (id)init { return _objc_rootInit(self);}id_objc_rootInit(id obj){ // In pra...…
-
NSObject的本质(四) isa与superClass
目录 isa superClass 总结isa1.我们先把instance、 class、 meta-class放到一个表中看下 instance 实例对象 class 类对象 meta-class 元类对象 isa isa isa … superClass superClass 成员变量的值 属性/对象方法/协议/...…
-
NSObject的本质(三) 对象分类
目录 对象分类对象分类一、OC对象主要分为三种 instance 实例对象 class 类对象 meta-class 元类对象二、instancePerson * person1 = [[Person alloc] init];person1->_age = 3;Person * person2 = [[Person alloc] init];person2->_age = 4;person1与person2是NSObject的instance对象(...…
-
NSObject的本质(二) 内存查看与优化
参考文章:字节范儿 の 内存对齐目录 NSObject对象内存查看 NSObject对象内存优化NSObject对象内存查看//创建一个Student对象Student * student = [[Student alloc] init];student->_age = 18;student->_number = 20;lldb调试:(lldb) po class_getInstanceSize([student class]) 16(lldb) po mallo...…
-
NSObject的本质(一) 占用内存
目录 NSObject对象占用多少内存NSObject对象占用多少内存一、先来认识两个函数可通过这两个函数来查看实例大小和占用空间的大小获取实例大小//获得NSObject实例对象的成员变量所占用的大小(理论需要的大小)size_t size = class_getInstanceSize([obj class]);printf("size=%zu\n",size);//8获取开辟空间大小//获得obj指针所指向内存的大小(实际分配的大小)size_t size1 = malloc_si...…