- 博客(161)
- 收藏
- 关注
原创 内存管理(五)深浅复制
深浅复制深复制与浅复制深复制源对象和副本对象不同的各两个对象源对象的引用计数器不变,副本对象的引用计数器为 1(因为是新产生的)本质产生了新的对象浅复制源对象和副本对象是一个对象源对象(副本对象)引用计数器 + 1,相当于做了一次 retain 操作本质没有产生新的对象复制与计数器深复制 NSString *str = [NSString stringWithFormat:@"55555555555555555555"]; NSMutableSt
2022-03-06 14:30:00 368
原创 内存管理(三)AutoreleasePool
内存管理(三)AutoreleasePool前言本篇接着探索自动释放池的底层原理准备工作Objc-818.2概念延迟释放和自动释放池有些函数、方法需要返回一个对象,而系统可能在该对象被返回之前,就已经销毁了对象。那么为了保证函数、方法返回的对象在被返回之前不被销毁,我们就要使用自动释放池进行延迟销毁(NSAutoreleasePool)所谓自动释放池,是指它是一个存放对象的容器(集合),而自动释放池会保证延迟销毁该池中所有的对象。出于自动释放池的考虑,所有的对象都应该添加到自动释放池中,这样
2022-03-04 08:30:00 592
原创 内存管理(二) ARC
内存管理(二) ARC上篇我们介绍了MRC,本篇我们介绍下ARCARC概述ARC是一种编译器功能,它通过LLVM编译器和Runtime协作来进行自动管理内存。LLVM编译器会在编译时在合适的地方为 OC 对象插入retain、release和autorelease代码来自动管理对象的内存,从而彻底解放程序员。ARC不能解决的问题Block等引发的循环引用问题(更多循环引用看我这篇文章)底层 Core Foundation 对象需要手动管理所有权修饰符__strong__weak__
2022-03-03 18:09:19 2844
原创 内存管理(一)MRC
内存管理(一)MRC管的谁在Objective-C中创建的对象都分配在堆区,内存管理针对的也是这块区域。引用计数Objective-C内存管理的核心其实引用计数,引用计数(Reference Count)是一个简单而有效的管理对象生命周期的方式。当我们创建一个新对象的时候,它的引用计数为 1,当有一个新的指针指向这个对象时,我们将其引用计数加 1,当某个指针不再指向这个对象时,我们将其引用计数减 1,当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向了,这个时候我们就可以将对象销毁,回收内
2022-03-03 18:04:41 3295
原创 指针的偏移
指针偏移指针运算符&和*是两种指针运算符&是取地址运算符 具有取出内存地址的功能*是间接寻址运算符 可以取出指定的内存地址上的值代码 /* * 间接寻址运算符 & 取地址符运算符 */- (void)test { int a = 1; int *b = &a; int c = *b;}1、变量a:1,变量a地址:0x7ffeeb6be17c2、定义一个int *类型的指针变量b 3、指针变量b指向的a的值:1基
2021-12-19 13:41:10 1671
原创 类中的 @property @synthesize @dynamic
@interface Person : NSObject@property(nonatomic, strong) NSString *age;- (void)test;@end@implementation Person- (void)test { // 调用setter方法 self.age = @"5"; // 调用getter方法 NSLog(@"%@",self.age);}@end调用- (void)viewDidLoad { [super
2021-12-19 13:33:14 485
原创 weak源码分析流程图
前言本篇weak源码分析流程图,用来辅助理解weak源码。storeWeakweak_unregister_no_lockweak_entry_for_referentremove_referrerweak_entry_removeweak_entry_insertweak_register_no_lockappend_referrergrow_refs_and_insertweak_grow_maybeweak_resize...
2021-12-19 13:31:05 254
原创 weak实现原理
weak 实现原理下面的一段代码是我们在开发中常见的weak的使用- (void)viewDidLoad { [super viewDidLoad]; NSObject *obj = [[NSObject alloc] init]; __weak NSObject *weakp = obj;}汇编runtime调用objc_initWeakobjc_initWeak(&weakp, obj);objc_initWeak源码id objc_initWea
2021-12-19 13:30:31 1391
原创 block _forwarding指针
_forwarding指针上面提到__forwarding指针指向的是结构体自己,当使用变量的时候,通过结构体找到__forwarding指针,在通过__forwarding指针找到相应的变量 为什么要这么设计呢?这样设计的目的是为了方便内存管理当block在栈中时,__Block_byref_age_0结构体内的__forwarding指针指向结构体自己当block被复制到堆上时,会将block中引用的变量也复制到堆中而当block被复制到堆中时,栈中的__Block_byref_age_0
2021-12-12 21:00:00 897
原创 block的循环引用
前言block的循环引用Q: 为什么 block 会产生循环引用?相互循环引用:如果当前block对当前对象的某一成员变量进行捕获的话,可能会对它产生强引用。根据block的变量捕获机制,如果block被拷贝到堆上,且捕获的是对象类型的auto变量,则会连同其所有权修饰符一起捕获,所以如果对象是__strong修饰,则block会对它产生强引用(如果block在栈上就不会强引用)。而当前block可能又由于当前对象对其有一个强引用,就产生了相互循环引用的问题;总结必须同时满足2个条件1、 b
2021-12-11 11:50:42 3421
原创 block对copy的实现
对block进行copy经常会用到,block的copy底层是什么实现的?之前的文章介绍了block的数据结构和内存管理,本篇说一下block的copy实现。copy的范围case 1 // struct __main_block_impl_0 需要copy 示例代码int age = 6;void(^block)(void) = ^{ NSLog(@"a==%d",age);};case 2 // struct __main_block_impl_0 需要copy NSObje
2021-12-09 00:32:02 807
原创 block的内存管理
对比对象类型 生成的block变量结构体struct __Block_byref_obj2_1 { void *__isa;__Block_byref_obj2_1 *__forwarding; int __flags; int __size; void (*__Block_byref_id_object_copy)(void*, void*); void (*__Block_byref_id_object_dispose)(void*); NSObject *__strong obj2;
2021-12-07 18:07:27 648
原创 block变量捕获机制
本文打算分 基本类型和 对象类型 进行论述学习内容:基本数据类型例如:1、 捕获变量2、 __block 修改变量3、 block变量结构体3、 底层逻辑4、 __forwarding指针5、 尝试使用 __forwarding指针对象类型:1、 捕获变量2、 __block 修改变量3、 block变量结构体3、 底层逻辑4、 __forwarding指针5、强弱引用6、内存管理7、循环引用基本数据类型捕获变量int a = 1;static int b
2021-12-04 19:14:00 883
原创 Clang看block底层结构
学习目标:疑问:block到底是什么1:block是oc对象2:block是指针block是oc对象: int age = 30; void (^yang)(void) = ^{ NSLog(@"%d", age); }; yang();clang转cppstruct __block_impl { void *isa; int Flags; int Reserved; void *FuncPtr;};st
2021-12-03 22:00:00 464
原创 block分类
介绍下block分类写一个全局block- (void)test { void(^yang1)(void) = ^ { }; yang1(); NSLog(@"%@",[yang1 class]);}打印2021-11-24 19:31:24.613795+0800 09_分类[42172:32561212] __NSGlobalBlock__写一个堆block (ARC)- (void)test2 { int age = 30; // ARC特
2021-12-02 18:19:38 378
原创 const和指针
学习内容:区分 const指针 和 指向const的指针例如:写代码经常遇到下列写法,有什么区别1 const int *p2 int const *p 3 int *const p 4 int const *const p5 const int *const p片普通指针- (void)test { int a = 10; int b = 20; int *p = &a; *p = 6; // 间接通过指针变量p修改变量a的值 p =
2021-11-19 23:47:58 464
原创 汇编看指针
前言开发中经常使用指针访问变量修改变量值, 那么编译器是怎么翻译指针的 或者说指针在汇编层面到底是什么mov 和 lea 指令指针的分析离不开这两个指令,简单看下mov指令mov指令GNU汇编器输出AT&T汇编时为 mov 指令添加了一个维度,在其中必须声明要传送的数据元素的长度因此,指令就变成了如下:movx其中 x 可以是下面的字符:1,q用于64位的4字值2,l用于32位的长字值3,w用于16位的字值4,b用于8位的字节值源码- (void)asm_point {
2021-11-19 18:28:28 2568
原创 汇编看if else
我们先来思考几个问题1、 我们经常使用到的if else 流程语句代码 是怎么被机器读懂的?2、 它背后的本质是什么?3、从汇编的角度去看 if else 又是什么呢 ?4、不同的汇编对if else 的解释 是相同的吗?本文分别从ARM和AT&T汇编去分析一段oc代码源码- (void)cycle { int a = 6; int b = 10; if (a == b) { NSLog(@"相等"); }else {
2021-11-19 11:53:08 1783
原创 汇编看函数栈
函数栈对齐堆栈栈在计算机中就是一块连续的存储区域(至少虚拟地址是连续的),在这块连续的存储区域写入和删除数据依据先进后出的规则进行栈空间由系统自动分配自动释放,我们经常在函数内部创建的局部变量等数据是存放在栈帧中在虚拟地址上是连续的 在物理内存是分散的(本文讨论都是在虚拟内存上)栈的生命周期1、Kernel创建用户栈,为栈分配内存空间,用户栈的建立是伴随着可执行文件的加载建立的。栈其实分为内核栈 和用户栈 内核栈不在讨论范围内2、运行到用户程序的main函数,main()函数内部调
2021-11-18 20:42:55 359
原创 汇编看函数栈构成
汇编查看源码的内存分布源码- (void)test1 { int a = 1; NSLog(@"%p",&a);}& 取变量a地址 16进制输出a变量的值(lldb) p &a(int *) $2 = 0x00007ffee6c9c00c(lldb) p/x a (int) $12 = 0x00000001那么 0x00007ffee6c9c00c 怎么来的0x00000001 是怎么存储的完整汇编指针偏移`-[ViewContro
2021-11-18 17:08:35 624
原创 CocoaPods Guides : pod install vs pod update
简介许多人开始使用CocoaPods时候都认为:pod install 仅在首次用CocoaPods建立工程的时候使用,之后更新使用pod update,但事实并非如此。本文目的是解释什么时候使用pod install 和 pod update 简而言之使用pod install来安装新的库,即使你的工程中已经有了 Podfile文件 并且已经执行过pod install命令,但...
2018-09-05 16:48:59 383
原创 UIView+PlaceholderView介绍
经常需要处理这种占位图业务 (无网 UFO 无数据 NoData) UIView+PlaceholderView 尝试用一行代码更优雅的去处理列表中的占位图业务问题 UIView+PlaceholderView 可以提供给你 1、 使用链式语法,一行代码创建完成 2、采用 ph. 命名空间,比如 RxSwift 的 rx.,SnapKit 的 snp. ...
2018-02-12 18:52:34 1242
原创 iOS 中关于Copy的疑问汇总
疑问清单:小编近几年的开发过程中,自己或同事遇到过一些关于Copy的疑问,现收集汇总下来。也欢迎大家提出自己的疑惑,小编后续一起补上。一、疑问代码// 有的人用 strong 有的用copy@interface ViewController ()@property (nonatomic, strong) NSString *str;@end// 深浅Copy 啥区别,下面代码是深了还是浅了 ?
2017-03-17 11:50:46 1087
原创 OC中的copy
前言不敢说覆盖OC中所有copy的知识点,但最起码是目前最全的最新的一篇关于 copy的技术文档了。后续发现有新的copy 知识点,我会第一时间更新到这篇博客内。先提供一下完整的代码链接 下载完整代码 OC_Copy 后续博客中会用到。本篇博客内容结构图:喜欢跳跃阅读的同学,可以展开 “前言” 上面的 “目录” ,进行选择性阅读NSObjct对象赋值操作在内存中的表现将这部分拿到开篇来说,是因
2017-03-16 20:12:44 1416
原创 如何更换个人CSDN博客 用户头像
前言首先吐槽一下:小编最近想更换个人CSDN博客的头像, 发现PC端网页上怎么搞都不成功。问了同事,竟然也遇到同样的问题, 根据小编的性格,这是不能容忍的,一个CSDN 技术网站,居然头像都不给换,不可能呀。。。。。 小编相信 一定是可以换的。最终通过自己验证找到了一种 通过手机版 的CSDN 来更换 头像,进而实现PC端网页同步的方法。(网上论坛上的直接在PC上更换浏览器 和 清空浏览器缓存的方
2017-01-25 12:45:13 5595 10
原创 Objective-C Associated Objects 的实现原理
前言想突破自身的技术瓶颈,提高自身iOS开发水平,深挖 Runtime源码 一定是个不错的方法。本篇博客我们结合 Runtime源码 讲一下 Objective-C Associated Objects 的实现原理。 由于在iOS开发中经常需要使用分类,如果我们需要为已经存在的类添加属性,使用 @property 并不能在分类中正确创建实例变量和存取方法,不过 通过 Objective
2017-01-22 12:17:27 1089
原创 面试被问Weex ,初步了解Weex,你看我就够了。
前言去年iOS职位面试,大多数面试官通常都挖这么一个坑,比如会问你,怎么看待React Native ,会不会Note.js 跨平台开发,知道Weex吗? 我相信多数没有准备过的面试者都折戟沉沙,或许这些技术,面试官也未曾亲自用过,那为什么面试官还要去问呢? 一方面:通过这个可以评估你个人的学习新知识的能力和对待新技术的态度。另外一方面: 也是最重要的,压你工资。 反过来,我们作为求职者,了解或者进
2017-01-13 12:10:15 9992 2
原创 KVC/KVO 进阶(四)KVC是如何处理异常的
前言 上篇文章大致阐述了KVC在key正确情况下的执行过程,这篇来说说key错误时KVC是如何运行的。正文KVC中最常见的异常就是不小心使用了错误的Key,或者在设值中不小心传递了nil的值,KVC中有专门的方法来处理这些异常。 通常在用KVC操作Model时,抛出异常的那两个方法是需要重写的。虽然一般很小出现传递了错误的Key值这种情况,但是如果不小心出现了,直接抛出异常让APP崩溃显然是
2016-10-28 16:36:18 716
原创 KVC/KVO 进阶(三)KVC的验证和异常处理
KVC的验证和异常处理一般情况下,我们都可以正确的使用kvc,但遇到一些复杂的情况,我们无法分辨 key 或者 value 是否合法化 比如: 我们给persion 赋予一个height的属性。运行程序,最终crash ,如何规避掉这种crash。 //perion没有 height属性 [persion setValue:@181 forKeyPath:@"height"];输出结果2016
2016-10-28 15:59:05 1464
原创 KVC/KVO入门
导语 KVC/KVO 在iOS设计模式中具有很重要的地位,在平常的优化代码,面试问答等经常会用到,甚至很多高级的iOS开发技巧都是基于KVC实现的,因此,想提高自己的开发能力,不能仅限于掌握一些KVC/KVO 的基础用法,必须对期底层原理知其所以然,逐步的推敲和掌握 ,应用到自己的代码中。目前网上关于KVC/KVO的文章在非常多,小编打算站在巨人的肩膀上,加上自己的一些开发经验和理解,遵循由浅到
2016-10-28 15:19:14 797
原创 KVC/KVO 进阶(二)KVC方法执行顺序
KVC API KVC以非正式协议的方式出现在 Foundation/NSKeyValueCoding KVC方法执行顺序Persion.m#import "Persion.h"@implementation Persion@synthesize name = _name;- (void)setName:(NSString *)name { NSLog(@"%s",__func__)
2016-10-27 18:13:30 1091
原创 KVC/KVO 进阶(一) 底层原理
导语 上篇文章介绍了一些KVC/KVO的简单用法,本篇介绍一下KVC/KVO的底层原理。创建 person 和 car 类person.h@class Car;@interface Persion : NSObject{ NSString *_adress;}@property (nonatomic, strong) NSString *name;@property (non
2016-10-27 15:32:51 2314
原创 CocoaPods私有库
简介 前一篇文章已经介绍过如何制作Pods公有库,下面将要介绍如果通过CocoaPods和git来维护我们的私有库导语 个人或公司在开发过程中,会积累很多可以复用的代码,有些我们不想开源,又想像开源库一样在CocoaPods中管理它们,那么就可以通过私有仓库来管理最坑的误区 需要注意pods私有库我们需要维护两个库,一个是私有的Specs,一个是我们自己的代码工程(真正的源码),小编
2016-10-19 21:28:20 986
原创 CocoaPods公有库
导语 Cocoapods是iOS开发中一款优秀的包管理工具,Cocoapods背后的原理是什么呢?如何制作出属于自己的私有库?如何制作属于自己的公有库呢?Cocoapods原理 关于具体的原理,可以参考Objc上的这篇文章:http://objccn.io/issue-6-4/如何制作属于自己的公有库我们以 AFNetworking 为例,执行 pod search ‘AFNetworkin
2016-10-18 19:17:20 1388 2
原创 Xcode8 插件失效不能用
之前Xcode是7.3, 升级Xcode8之后发现之前的插件都失效了,然后查了些资料发现这种方法可以解决. 解决方案来自:https://github.com/inket/update_xcode_plugins 详细步骤如下: 1、打开终端,输入 install update_xcode_plugins 如果有报错: 则继续输入以下命令并执行,否则跳过此步。 sudo gem inst
2016-10-17 16:03:19 4552
原创 苹果电脑操作系统的演变历程
随着 最新的苹果系统 macOS Sierra X v10.12 的稳定,今天小编把自己的电脑系统升级为了macOS Sierra。 发现 最新的系统版本 “命名方式”发生了改变,对比之前的系统版本“命名方式”发现伴随着我们 十几年的 “OS X” 前缀没有了,改成了 “macOS” 作为前缀 小编,查阅了一些苹果资料,发现原来苹果电脑的操作系统 “命名方式”也有很多的故事,下面我们一起来
2016-10-13 13:33:39 9091 2
原创 UIView 绘制渲染机制
前言APP 页面优化 对小编来说一直是难题,最近一直在不断的学习和总结 ,发现APP页面优化说到底离不开 view的绘制和渲染机制。网上有很多精彩的博客,小编借鉴之前N多大牛研究成果,同时结合自己遇到的一些问题,写了这篇博客。尝试和大家一起探讨一下问题:view绘制渲染机制和runloop什么关系? 所谓的列表卡顿,到底是什么原因引发的? 我们经常在drawrect方法里绘制代码,但该方法是谁
2016-09-06 19:09:39 15725 7
原创 Cocoapods1.0.1版本安装教程
关于 cocoapods 的安装,网上大部分教程都是基于 0.39版本 的教程,现将cocoapods1.0.1版本的安装教程进行整理: (如果你是 cocoapods 的使用大神,请忽略这篇文章,该篇文章讲的都是关于 cocoapod的一些基本知识。)rvm - home-brew - ruby - gem - cocoapods 这些在咱们安装 cocoapo
2016-08-19 16:44:33 2373
原创 如何添加ssh公钥 以及 clone 远程服务器的代码
打开终端,执行cd ~/.ssh 如果提示错误 ,表示 文件夹不存在,那么 执行mkdir ~/.ssh ,然后 cd ~/.ssh然后 ls-l,如果一个文件夹没有,执行 ssh-keygen -t rsa -C "yangyangzhang17@creditease.cn"这个邮箱换成自己的邮箱 详细 步骤 看下图:
2016-07-21 16:47:39 1416 1
原创 如何配置 outlook 企业邮箱
小编最近入职新公司,发现公司的企业邮箱 使用的是 outlook邮箱,对于习惯了使用 QQ企业邮箱 和 网易企业邮箱,这是一件非常痛苦的事情,因为 使用 传统的 QQ企业邮箱 一直没有配置成功,使用苹果自带的邮箱 也没有配置成功, 一直在需找如何 保证 网页邮箱 手机端邮箱 和 mac电脑端的邮箱的同步呢 ?经过一番周折,最后小编找到了解决问题的方法。Mac上 依然推荐使用 Form
2016-07-21 16:15:22 7042
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人