4 爱勤海之旅

尚未进行身份认证

编程中充满乐趣,寻找,定位,更改,完成!

等级
TA的排名 2w+

iOS - KVC底层应用

之前简单得讲过一些KVC的用法,但是并不能深入理解KVC内部实现及其原理,下面主要讲下KVC的底层原理。取值 valueForKey:在使用KVC取值的时候,使用valueForKey:方法,该方法会返回一个id类型的对象,那么它的内部会怎么处理的呢?现在我们使用该方法: Teacher *teacher = [[Teacher alloc] init]; NSString *...

2020-03-28 21:30:19

iOS - 使用clang将Object-C代码转换为C++代码时 'UIKit/UIKit.h' file not found

问题在MacOS项目下使用clang命令clang -rewrite-objc main.m可以把main.m文件转换成C++文件,方便研究内部实现。但是如果是iOS项目的话执行上面clang命令就会报出下面错误:shiyudeMacBook-Pro:LeaksTest shiyusun$ clang -rewrite-objc main.mmain.m:9:9: fatal error: ...

2020-03-22 23:06:02

iOS-线程同步的几种方式

在多线程开发中数据的安全是非常重要的,在开辟分线程执行耗时操作以保证主线程不阻塞的同时,数据的安全也要保证才行。如果同一个资源(一个变量或者一段代码或者存储的数据等)同时被多个线程访问修改,可能会造成数据的错乱,得到的也就不是自己想要的结果,所以多线程开发中线程间的同步有时显得尤为重要。实现多线程间的同步方式:锁(互斥锁、条件锁、递归锁)和GCD(队列、信号量、栅栏)。了解更多类型的锁可以查看线...

2020-03-16 16:02:43

iOS - 线程中常见的几种锁

线程锁主要是用来解决“共享资源”的问题,实际开发中或多或少的都会用到各类线程锁,为了线程的安全我们有必要了解常见的几种锁,下面是本人查看一些大牛的博客然后整理的内容,加上自己的一些见解,水平有限,如果不慎有误,欢迎交流指正。常见锁列举自旋锁(OSSPinLock、os_unfair_lock)互斥锁(pthread_mutex_t、NSLock、@synthronized)递归锁(pth...

2020-03-15 21:20:47

iOS -多线程之pthread

pthread是POSIX thread的简写,一套通用的多线程API,适用于Unix、Linux、Windows等系统,跨平台、可移植,使用难度大的C语言框架,线程生命周期由程序员管理,百度百科上有详细的介绍。在多线程方面iOS有GCD、NSThread、NSOperation,所以开发时pthread几乎用不到,以下就简单运用pthread开启一个子线程,用来处理耗时操作。导入头文件想使用...

2020-03-12 16:20:52

Swift - 泛型

泛型是Swift中重要的类型之一,意为不确定的类型。我们知道带有参数的函数是必需要指定参数的类型的,举个例子观察下面有几个同名函数实现相似的功能,但参数类型不同:一、节点泛型 func methodOne(param:String) { print("\(param)") } func methodTwo(param:Int) { prin...

2020-03-05 16:51:09

Swift - is(类型转换)和 as(类型转换)

在Swift中一般使用“is”关键字实现类型检查,使用“as”关键字实现类型转换,首先说一个类型层次概念,举个例子,创建一个基类:class Person { var weight:Float init(weight:Float) { self.weight = weight }}之后创建两个继承它的子类,并且在子类中定义子类特有的属性:class...

2020-02-25 19:45:42

The default interactive shell is now zsh.

Mac-关于升级macOS Catalina后,终端试用问题,每次打开终端都会有一下提示:The default interactive shell is now zsh.To update your account to use zsh, please run `chsh -s /bin/zsh`.For more details, please visit https://support...

2020-01-17 15:51:02

iOS-动态方法决议与消息转发机制

在消息发送机制中我们介绍过,OC是动态语言,对象调用方法其实就是对象接收消息,而消息的发送采用“动态绑定”机制,具体会调用哪个方法直到运行时才确定,然后去执行绑定的代码。绑定的过程:以下面代码为例Person *p = Person.new;[p eat];方法调用时,编译器会底层将之转换成C语言的函数objc_msgSend(p, @selector(eat));,来对p发送消息。消...

2019-12-10 15:55:51

iOS-消息发送机制

在Object-C中,方法的调用不再理解为对象调用其方法,而是要理解成对象接收消息,消息的发送采用"动态绑定"机制,具体会调用哪个方法直到运行时才能确定,确定后才会去执行绑定的代码。OC调用方法的形式如下:Person *p = Person.new;[p eat];从形式上看调用方法是使用中括号的形式,但是我们知道Object-C是动态语言,当代码执行到该调用的时候,系统到底做了哪些工...

2019-12-08 22:30:42

iOS-动态添加方法

动态添加方法可以在动态创建的类中添加也可以在已存在的类中添加,先来看下动态添加方法的定义函数:OBJC_EXPORT BOOLclass_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, const char * _Nullable types) OBJC_AVAI...

2019-12-07 15:35:45

iOS-动态添加属性

前一章介绍了动态创建类,这章主要讲动态添加属性。一、动态添加实例变量Ivar:通过函数class_addIvar()添加属性,更准确的说是添加成员变量,函数定义如下OBJC_EXPORT BOOLclass_addIvar(Class _Nullable cls, const char * _Nonnull name, size_t size, uint8_t...

2019-12-06 11:26:53

iOS-动态创建类

在运行时动态创建一个类:导入头文件#import <objc/runtime.h>,动态添加类,创建一个继承 NSString 的类NSStringSubClass类,如下代码: // 类名也可以直接使用C字符串写法 ”NSStringSubClass“ NSString *className = @"NSStringSubClass"; // Cre...

2019-12-04 13:20:09

iOS-类和对象之本质

iOS界比较流行的一句话:万物皆对象!为什么会有这么一个说法呢?难道类(class)也是对象(object)?对象其本质又是什么?这些问题在实际开发中或许遇不到,但当真的涉及到底层的开发,就要面对这些问题。想要透析对象的本质,就要了解运行时(runtime),苹果已经将 Object-C runtime 代码开源了,从:http://opensource.apple.com/source/objc...

2019-12-02 18:15:59

iOS-Masonry实现原理

为视图添加约束的方法有很多,可以使用系统原生的约束方法,即NSLayoutConstraint约束类;可以使用storyboard添加约束;甚至使用CGRectGetMaxY(rect)的若干方法为视图布局。这次我们要说的是使用纯代码添加约束,一个轻量级的第三方约束框架Masonry,作者Jonas Budelmann(乔纳斯·布德曼)很牛匹,相信很多纯代码编程的程序员都用过这个框架,写得很酷,使...

2019-11-29 18:41:38

iOS-instancetype与id的区别以及alloc、init与new的区别

不管是iOS原生方法还是平时自己写方法,都能碰到instancetype和id,那么这两者有何区别呢?一、instancetype和 id的异同相同点:instancetype是clang 3.5开始提供的一个关键字,跟id类似,用于表示某个方法返回的未知类型的Objective-C对象。不同点:instancetype只能作为返回值类型,id不仅可以作为返回值类型也可以当作参数使用。...

2019-11-28 17:58:14

iOS-封装系统通讯录调用

在项目中有的地方会用到获取通讯里面的某个联系人的联系方式,这里我们稍微封装一下这个方法。第一步:我们需要获取通讯录权限在info.plist文件中,添加 key : Privacy - Contacts Usage Description,value:方便用户从通讯录选取要保存的号码,如下图:第二步:新建通讯录管理类1、新建一个ContactManager类添加两个Block,用于回调...

2019-11-25 13:26:51

iOS-雷达数据图

这次简单的写一个关于雷达数据显示的案列,实现简单,主要用UIBezierPath以及CAShapeLayer,如下图:具体实现:思路:如何绘制上图中的六边形?我们只需要确定最外层六边形的边长(确定大小)和六边形的中心点的坐标(确定位置)。绘制几层六边形可以随意控制(把边平分几段)。然后添加每个顶点旁边的文本。最后根据相应的数据值绘制layer(颜色层)。实现代码:1、初始化默认数据:-...

2019-11-13 13:13:44

iOS - 添加代码片段(Code Snippets)

添加代码段目的是为了减少敲写重复的代码,xcode原生带有很多代码段,例如for语句、switch语句等,{}表示代码段。代码段制作:具体制作代码段也很简单。先选中一段代码,然后右键,选择Create Code Snippet。参数解释Title::名称(代码段名称)。Summary:描述(代码段干啥用的)。Platform:作用平台(All、iOS、macOS、tvOS、wat...

2019-09-16 11:12:14

OenCV - 导入OpenCV遇到的的错误

1、集成到官网下载opencv2.framework,苹果开发选择iOS pack,自行选择版本,我选则是OpenCV – 4.1.1最新版。下载好之后,拖进项目中即可。2、报错信息报错1:enum { NO, GAIN, GAIN_BLOCKS }; Expected identifier,这个错误应该有三处,只要把NO修改成 NO_EXPOSURE_COMPENSATOR 或 NO_EX...

2019-09-10 17:55:40

查看更多

勋章 我的勋章
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 阅读者勋章Lv2
    阅读者勋章Lv2
    授予在CSDN APP累计阅读博文达到7天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。