240 发简信
IP属地:湖南
  • 使用RunLoop监控iOS应用卡顿

    在iOS开发中,我们经常会遇到应用卡顿的问题。为了帮助开发者更好地发现和解决卡顿问题,本文将介绍如何使用RunLoop监控应用卡顿。 RunLoop简介 RunLoop是iO...

  • 120
    iOS 半透明新手引导的封装

    经过一个月的加班加点,由我负责的公司分项目终于完成了阶段性的开发,在改bug的空余,总结了一下工程中用到的一些东西,现把我封装的“半透明新手引导功能”分享出来,供大家交流学习...

  • 嗯呢,是的,写了一半,中途在公司转做前端项目了,一直没抽出时间继续写,😭

    Swift底层原理探索5----闭包

    闭包表达式(Closure Expression) 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数 这里的in 是用来区分 函数类型信息 和 ...

  • self = person结构体第一段8字节内存空间(isa)
    self.name = person结构体第二段8字节内存空间(name)
    self.address = person结构体第三段8字节内存空间(address)
    self.job = person结构体第四段8字节内存空间(job)

    Runtime原理探究(八)—— Runtime综合面试题

    Runtime系列文章 Runtime原理探究(一)—— isa的深入体会(苹果对isa的优化)[https://www.jianshu.com/p/30de582dbeb...

  • @interface CLPerson : NSObject
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, copy) NSString *address;
    @property (nonatomic, copy) NSString *job;
    -(void)print;
    @end

    看上面这段定义,当上面的Person类被实例成对象person之后,这个对象里面存放的应该是 isa(8字节) + name指针(8字节)+ address指针(8字节)+ job指针(8字节),这32个字节的的信息被存放在堆空间上,实例对象的本质就是一个结构体而已,self指针指向了这个结构体(也就是person实例对象)的首字节,结构体的知识可以去复习一下C语言, 结构体里面的成员变量如何访问呢, 就是 self-> name / address / job, 转换成oc的语法,就成了 self.name/address/job
    print函数里面打印的就是 self.name, 那么根据规则,它就能取到name对应的这8个字节进行信息读取, name是不需要寻找的, self.name被翻译成汇编代码之后,就会指挥计算机,读取对应内存位置里面的值,

    Runtime原理探究(八)—— Runtime综合面试题

    Runtime系列文章 Runtime原理探究(一)—— isa的深入体会(苹果对isa的优化)[https://www.jianshu.com/p/30de582dbeb...

  • iOS用dispatch_group_t监听多个异步请求全部返回和多任务下载

    提起ios中多个异步函数后的同步问题,自然会想到 dispatch group 这个概念,那么它能够解决异步网络请求的问题吗? 对于dispatch多个异步操作后的同步方法,...

  • @Yvan_deng 不敢当 能对你有帮助就好😊

    Swift底层原理探索5----闭包

    闭包表达式(Closure Expression) 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数 这里的in 是用来区分 函数类型信息 和 ...

  • 120
    简述@weakify、@strongify

    前言 在开发中,经常在控制器中用到block语句,在block语句中如果需引用self,而self(控制器)对象中又持有block对象,就会造成循环引用循环引用,导致内存泄露...

  • -(void)sellTicket {
    NSInteger oldTicketsCount = self.ticketsCount;
    sleep(.2);//模拟任务时长,便于问题显现
    oldTicketsCount--;
    self.ticketsCount = oldTicketsCount;
    NSLog(@"还剩%ld张票-------%@",(long)oldTicketsCount, [NSThread currentThread]);
    }
    案例中多线程并发的是sellTicket这个方法,这个方法本身是没有加锁的,因此该方法里面的第一句NSInteger oldTicketsCount = self.ticketsCount;就可能由于多线程并发的原因,取到相同的值,那么后面的数据就都错了,没有做到线程安全。 atomic只是保证了getter/setter方法内部的线程安全,上面的代码,属性值赋值给oldTicketsCount 局部变脸之后,就不受atomic保护了,因此在实际场景下,atomic没什么作用,还增大大增加了开销,所以iOS里面基本不用。

    如何保证iOS的多线程安全

    什么会给多线程的安全造成隐患? 有了多线程技术支持,我们可以并发的进行多个任务,因此同一块资源就有可能在多个线程中同时被访问(读/写)。这个现象叫作资源共享,比如多个线程同时...

  • @FYXin 也是为了自己再看的时候不用再查其他资料了 就尽可能详细点😄

    Swift底层原理探索5----闭包

    闭包表达式(Closure Expression) 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数 这里的in 是用来区分 函数类型信息 和 ...

  • 120
    Swift底层原理探索4----结构体和类

    结构体 在Swift标准库中,大多数公开类型都是结构体,而枚举和类只占很小的一部分比如Bool、Int、Double、String、Array、Dictionary等常见类型...

  • 120
    Swift底层原理探索3----可选项

    可选项(Optional) 可选项,一般也叫做可选类型,它允许将值设置为nil 在类型名称后面加个问号?来定义一个可选项 C语言中,变量声明之后,会自动被赋予初始值,Swif...

  • 120
    Swift底层原理探索2----枚举

    枚举的基本你用法 关联值(Associated Values) 关联值是直接存在枚举变量的内存里面的,这点要牢记,对于一个有固定取值范围的变量,设计成枚举比较合适 注意上看s...

  • 120
    Swift底层原理探索1----函数

    函数的定义 隐式返回 如果整个函数体是一个单一表达式,那么函数会隐式(自动)返回这个表达式 返回元组:实现多返回值 函数文档的注释 函数文档的注释需要严格按照上面的模版来填写...

  • 120
    Swift底层原理探索6----属性 & 方法

    属性 Swift中跟实例相关的属性可以分为2大类存储属性(Stored Property)类似于成员变量这个概念存储在实例的内存中 image结构体、类可以定义存储属性 im...

  • 120
    Swift底层原理探索5----闭包

    闭包表达式(Closure Expression) 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数 这里的in 是用来区分 函数类型信息 和 ...

个人介绍
汇编是检验一切语法糖的唯一标准