-
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...…
-
计算机渲染原理⭐️
目录 渲染原理 渲染流水线渲染原理一、屏幕刷新率是60FPS,且UI在主线程刷新1秒是1000毫秒,每秒进行60次屏幕刷新,也就是60帧图像,所以每帧图像停留的时间是16.17毫秒UI为什么要在主线程刷新?1、UIKit框架不是线程安全的,在不同的线程下分别更新UI会有问题,比如一个线程要把lable显示成功两个字,一个线程要把lable显示失败两个字。 所以需要放在一个线程内,这个线程就是主线程2、用户的触摸、手势等事件都是在主线程上处理的,如果 UI 操作在其他线程上执行,可能导...…
-
drawRect
目录 介绍 调用时机 调用栈介绍该方法是做什么的? 这个方法的默认实现什么也不做。 视图需要自定义绘制时(UIKit提供的视图无法满足时),可以重写该方法。比如渐变背景、绘制图形和路径等。需要注意的地方 当这个方法被调用时,UIKit已经为你的视图配置了适当的绘图环境,你可以调用任何绘图方法和函数。 您应该将任何绘图限制在rect参数中指定的矩形内。调用时机1、当视图首次显示时。 2、视图需要更新时,比如屏幕旋转和视图大小改变时。 3、调用setNeedsDis...…
-
layoutSubviews
参考文章:setNeedsLayout VS layoutIfNeeded 参考文章:[译] 揭秘 iOS 布局 参考文章:runloop 与 布局目录 介绍 调用时机 setNeedsLayout layoutIfNeeded 总结介绍-(void)layoutSubviews;子类可以根据需要重写这个方法,以执行更精确的子视图布局。initWithFrame:是在初始化时拿到的frame,如果初始化完成之后,父view的size发生了变化,需要对当前view及其子vi...…
-
CFBundleShortVersionString 与 CFBundleVersion
参考:info.plist key 说明目录 CFBundleShortVersionString CFBundleVersionCFBundleShortVersionStringCFBundleShortVersionStringCFBundleShortVersionString (String - iOS, macOS) specifies the release version number of the bundle, which identifies a released...…