自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(233)
  • 问答 (2)
  • 收藏
  • 关注

原创 声明

本人目前大二学生一枚,在学习iOS开发,以后并准备从事,因为看到关于iOS的知识不是很多,所以我会将我学习时记录的笔记分享出来,在这里让我们共同进步,如果有不对的地方,还请大佬给予帮助,谢谢! ...

2019-11-16 21:46:09 244 1

原创 为什么对象的isa和对象的地址不一样,类的isa和类的地址一样

isa = 存储类 + 其它值 - 是否正在释放 + 引用计数 + weak 其它值 - 是否正在释放 + 引用计数 + weak 这些仅仅就是针对对象而言,但是类当中没有这些东西,所以类的isa里面只存储了类(元类),所以isa的地址和类的地址一样,但是对象里面会包括这些东西,所以对象的isa地址和对象的地址不一样。 ...

2022-03-09 08:30:58 265

原创 set方法的本质

在所有属性的set方法调用的时候都会调用一个objc_setPropetyd的方法 我们可以将set方法分成三层,第一层就是正常我们自己调用的setter方法;第二层就是系统重定向的objc_setProptyd的方法;第三层就是最底层系统的方法。这么设计就是为了最底层的代码可以不需要改动,直接对中间层objc_setProptyd方法进行处理。大大提高了效率。这个时候又出现了第二个问题,系统到底是怎么讲我们自己调用的setter方法重定向到objc_setProptyd方法的,这个时候就是LLVM底层给.

2022-03-09 08:30:32 518

原创 OC当中各种编码的意义

编码的意义 举例 @16@0:8 @ : id 16 :占用内存 @ : id 0 : 从0号位置开始 : : SEL 8 : 从8号位置开始

2022-03-09 08:29:46 298

原创 类与对象的一个本质

类的本质 类的一个本质在底层就是一个objc_class的结构体 对象的一个本质在底层就是一个objc_object的结构体 只有类有继承的关系,对象没有继承(对象的继承来自于类的继承) 类的结构 superclass : 父类 cache : 缓存数据 bits : 内存数据(bits里面的data有数据) ...

2022-03-09 08:29:00 166

原创 isa指向

在打印isa的时候,需要将isa的指针与上isa的掩码(objc4-818.2 -> objc -> Project Headers -> isa.h -> 61行)0x007ffffffffffff8 isa的走位 对象 isa -> 类 isa -> 元类 isa -> 根元类 isa -> 根元类 继承链 对象 -> 类 -> NSObject 所有的类归根结底最原始就是NSObject [外链图片转存失败,源站可能有防盗链机制,建议将

2022-03-08 09:14:12 226

原创 objc_object VS NSObject && objc_class VS Class

OC环境 : NSObject - Class objc : C/C++ 汇编 也就是说NSObject 和Class 本质下面就是objc_object 和 objc_class

2022-03-08 09:06:28 3158

原创 联合体-结构体

结构体 结构体(struct)中所有变量是"共存"的–优点是"有容乃大",全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配 struct LGPerson { char *name; int age; double height; }; 所有属性都可以赋值 联合体 联合体(union)中是各变量是"互斥"的–缺点就是不够"包容";但优点是使用更为精细灵活,也节省了内存空间 union LGPerson { char

2022-03-08 09:05:51 403

原创 内存对齐方式

成员变量内部是以8字节对齐的(对象内部对齐方式) 在堆中的对象是以16字节对齐的(对象和对象之间对齐方式) 结构体内存对齐 注意:所占的位置必须是这个类型的倍数,当所有都查完之后进行里面最大类型的倍数进行内存对齐 ...

2022-03-08 09:05:23 433

原创 Xcode编译器上方的标记一般都代表什么

f : funcation T : typeof ’#‘ : 宏定义 s : struct

2022-03-07 08:27:37 2399

原创 Clang

苹果主导开发 clang -rewrite-objc main.m -o main.cpp : 把目标文件编译成c++文件 不过有些时候我们在转换成C++文件的时候,会找不到文件中的引入文件,可以利用下面的指令 xcrun -sdk iphoneos clang -rewrite-objc main.m -o main.cpp : 把目标文件编译成c++文件 ...

2022-03-03 08:21:15 2240

原创 LLDB指令

x person : 读当前对象(person)的内存情况 x/4gx person : 四段格式化读当前对象(person)的内存情况 流程控制 c(continus) : 继续 n(next) : 下一步(单步) s(step) : 进入 f(finish) : 跳出 断点设置 breakpoint set -n <函数名称> : 在函数名称的地方下断点 breakpoint set -n “-[viewController touchBegain]” -n “-[viewCont.

2022-03-03 08:20:46 341

原创 sizeof, class_getInstanceSize, malloc_size计算的都是什么

sizeof sizeof计算的是传入参数的类型的大小 class_getInstanceSize class_getInstanceSize计算的是传入的参数(对象)所有属性(对象内部)大小相加之后内存对齐的大小(不要忘记isa;8字节对齐) 想要知道malloc_size计算的方式是怎么计算的,就要知道malloc的流程 malloc流程 1⃣️ 2⃣️ 3⃣️ 这个时候我们发现calloc函数进不去,只能通过跑起来之后断点断在这里,利用汇编看符号,之后进行全局搜索(摁住con

2022-03-01 09:09:37 671

原创 alloc, init, new的区别

alloc 开辟内存空间,返回类指针 init return (id)self; 构造方法,工厂设计 给用户一个接口,便于个性化开发 new new = alloc init 但是不建议使用new,因为我们如果重写init {} 方法的话,new是不会重写的 ...

2022-03-01 09:03:12 159

原创 为什么对象内8字节对齐,对象外16字节对齐

对象内8字节对齐原因 原因 和计算机内存的读取有关系,计算机不会每次读取的时候都会变化自己读取的长度 计算机内每个类型(int double char)的字节长度最长的就是8字节,索性直接让计算机都按照8字节读取,所以8字节对齐 对象外16字节对齐原因 原因 因为每个类或者对象都会有isa指针,这个指针的大小就是8字节,苹果怕访问异常,如果都是8字节对齐,就有可能访问到别人的isa上(因为内存是一块挨着一块的),这样子就会出现一些错误,所以16字节对齐,给出来一些预留空间 为什么不是10,11,类似的

2022-02-16 14:26:58 825

原创 alloc的流程

1⃣️ 2⃣️ 3⃣️ 现在我们看的objc源码都是2.0的版本,之前还有一个1.0的版本 4⃣️ 5⃣️核心方法 最主要的就是最下面三个方法 他的最重要作用就是开辟内存 cls->instanceSize 先计算出需要的内存空间大小 这个大小只和对象的成员变量有关 在没有成员变量的时候最小开辟大小就是16字节(这里面最少有一个8字节,因为会存在父类的isa指针),之后instanceSize函数会进行一个判断,如果小于16字节,会自动变成16字节

2022-01-27 09:41:46 2482

原创 视频播放

0.倒入框架 import AVFoundation import AVKit 1.懒加载创建视频播放器 lazy var playerVC : AVPlayerViewController = { let tempPlayerVC = AVPlayerViewController() // 设置画中画 tempPlayerVC.allowsPictureInPicturePlayback = true l

2020-11-29 11:41:15 552

原创 远程播放音乐

0.倒入框架 import AVFoundation 1.懒加载播放器 lazy var player : AVPlayer = { let url = URL(string: "http://cc.stream.qqmusic.qq.com/C100003j8IiV1X80aw.m4a?fromtag=52") let item = AVPlayerItem(url: url!) let tempPlayer = AVPlayer(playerItem:

2020-11-29 11:40:44 540

原创 音乐播放

0.倒入框架 import AVFoundation 1.懒加载创建音乐播放器(并且直接设置一些属性) lazy var player : AVAudioPlayer? = { let url = Bundle.main.url(forResource: "235319.mp3", withExtension: nil) do { // 创建播放器 let tempPlayer = try AVAudioPlayer(cont

2020-11-26 21:07:32 470

原创 音效播放

直接封装成工具类,如果使用直接调用方法 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xwXh0dP7-1606395972409)(evernotecid://6D5FC5B5-BD49-4B4B-BFFA-512349E82058/appyinxiangcom/26192998/ENResource/p62)] 0.倒入框架 import AVFoundation 1.代码实现 class AudioTool: NSObject { class func

2020-11-26 21:06:32 256

原创 录音

0.倒入框架 import AVFoundation 1.懒加载录音对象 lazy var record : AVAudioRecorder? = { // url : 录音文件的路径 // setting : 录音的设置项 let url = URL(fileURLWithPath: "/Users/liuhongtao/Desktop/录音/abc.caf") let configDic : [String : Any] = [

2020-11-26 20:52:53 172

原创 获取通讯录

0.导入框架 import ContactsUI 1.创建联系人选择控制器 let vc = CNContactPickerViewController() 1.1 设置代理接收用户点击的联系人 vc.delegate = self 2.弹出控制器 present(vc, animated: true, completion: nil) 3.实现代理方法 // 取消选择联系人时调用 func contactPickerDidCancel(_ picker: CNContactPickerVi

2020-11-24 18:34:03 452

原创 应用间跳转

添加应用的scheme 我们如果想要从一个应用跳转到另外一个应用,还需要设置一个白名单 在item里面写上我们刚刚设置的shceme 普通跳转(从一个应用跳转到另外一个应用) override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { let url = URL(string: "Wechat:") if UIApplication.s

2020-11-24 18:33:29 674

原创 UIDunamic(物理仿真器)

创建物理仿真器 lazy var animator : UIDynamicAnimator = { let tempAnimator = UIDynamicAnimator(referenceView: view) return tempAnimator }() 重力 func gravity() -> Void { // 1.仿真行为 let behavior = UIGravityBehavior(items: [box1]

2020-11-24 18:31:17 171

原创 摇一摇

实现方法即可 摇一摇开始 override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { print("摇一摇开始") } 摇一摇结束 override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) { print("摇一摇结束") } 摇一摇取消 overrid

2020-11-13 20:29:18 193

原创 加速计

0.倒入框架 import CoreMotion 1.创建运动管理者对象 let manager = CMMotionManager() 2.判断加速计是否可用 if !manager.isAccelerometerAvailable { print("加速计设备损坏") return } 2.1设置采样间隔(1秒钟5次) manager.accelerometerUpdateInterval = 1.0 / 5 3.开始采集(推模式:

2020-11-13 20:28:34 165

原创 距离传感器

1.开启距离传感器功能 UIDevice.current.isProximityMonitoringEnabled = true 2.监听物体靠近或者离开设备的通知 NotificationCenter.default.addObserver(self, selector: #selector(stateChange), name: UIDevice.proximityStateDidChangeNotification, object: nil) 3.通知所调用的方法 @objc func stat

2020-11-13 20:28:04 348

原创 本地通知

请求授权(在AppDelegate.swift文件中书写) func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { registerAuthor() return true } // 请求授权 func register

2020-11-13 20:27:36 307

原创 使用照片选择器

1.判断数据源是否可用 if !UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { return } 2.创建照片选择控制器 let ipc = UIImagePickerController() 3.设置照片源 ipc.sourceType = .photoLibrary 4.设置代理 ipc.delegate = self 5.弹出选择照片控制器 present(ipc, animated: true, compl

2020-10-07 18:27:35 241

原创 如何修改modal(弹出控制器)出来的控制器的位置以及大小

1.创建弹出的控制器 let popVc = PopoverViewController() popVc.modalPresentationStyle = .custom PopoverViewController这是我自己创建的控制器,继承自UIViewController,原因是方便我管理 给控制器设置modalPresentationStyle属性为custom,因为只有设置了这个属性,我们在弹出控制器的时候后面的控制器才不会被移除,并且只有设置了

2020-09-21 16:11:05 2293 2

原创 使用动画(旋转)

1.创建动画 let rotationAnim = CABasicAnimation(keyPath: "transform.rotation.z") transform.rotation.z这个是旋转的方向(z轴方向旋转) 2.设置动画属性 // 从哪里开始旋转(从0开始) rotationAnim.fromValue = 0 // 旋转到哪里(旋转一圈) rotationAnim.toValue = (Double.pi * 2) // 旋转这么一圈的时间(5s)

2020-09-20 18:10:48 493

原创 便利构造方法(自己给一个类书写一个构造方法)

便利构造方法的特点 通常都是写在extension里面 init前面需要加上convenience 需要明确的调用self.init() convenience:便利,使用convenience修饰的构造函数叫做便利构造函数 便利构造函数通常用在对系统的类进行构造函数的扩充时使用 例子(我们给UIButton书写一个便利构造函数)(完整的文件代码) import UIKit extension UIButton { // 便利构造函数(自己书写一个构造函数)

2020-09-09 21:43:53 295

原创 如何书写一个类方法

Swift中的类方法是以Class开头的方法 比如我给UIButton书写一个类方法 class func creatButton(imageName : String , backgroundImageName : String) -> UIButton { // 创建button let button = UIButton() // 设置属性 button.setImage(UIImage(named: image.

2020-09-09 21:43:23 286

原创 Swift中异常的处理方式

如果在调用系统某一个方法时,该方法最后有一个throws.说明该方法会抛出异常,如果一个方法会抛出异常,那么需要对该异常进行处理 会抛出异常的方法 JSONSerialization.jsonObject(with: <data数据>, options: .mutableContainers) 处理方式 方式一:try方式 程序员手动处理异常 do { try JSONSerialization.jsonObject(with: <data数据>, options: .m

2020-09-06 21:34:51 439

原创 将一个json文件通过某些方式转换成我们的数组,并且可以遍历

1.获取文件路径 guard let jasonPath = Bundle.main.path(forResource: "<文件名称>", ofType: "<文件名称的后缀>") else{ print("没有获取到文件路径") return } 如果在文件名称里面已经写上了后缀,在type中就可以填写nil 2.通过文件路径将文件转成data数据 guard let jsonData = NSData(contentsOfFile: <文件的路径

2020-09-06 21:34:20 472

原创 类的属性监听器

在OC中我们可以重写set方法来监听属性的变化 Swift中可以通过属性观察者来监听和响应属性值的变化 通常是监听存储属性的改变(对于计算属性,我们不需要定义属性观察者,因为我们可以在计算属性的setter中直接观察并响应这种值的变化) 我们通过设置以下观察方法来定义观察者 willSet:在属性值被存储之前设置。此时新属性值作为一个常量参数被传入,该参数名默认为newValue,我们可以自己定义该参数名 didSet:在新属性值被存储后立即调用。与willSet相同,此时传入的是属性的旧值,默认参数名.

2020-08-19 22:35:32 249

原创 自定义类的构造函数

介绍 构造函数类似于OC中的初始化方法:init方法 默认情况下在创建一个类时,必然会调用一个构造函数 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数 如果是继承自NSObject,可以对父类的构造函数进行重写 重写构造函数 class Person : NSObject{ var age : Int = 0 var name : String? = nil override init() { // 在构造函数中,如果没有明确super.init(),那么系

2020-08-19 22:35:00 541

原创 类的属性定义

介绍 Swift中类的属性有多种 存储属性:存储实例的常量和变量 计算属性:通过某种方式计算出来的属性 类属性:与整个类自身相关的属性 定义存储属性 存储属性是最简单的属性,他作为类实例的一部分,用于存储常量和变量 可以给存储属性提供一个默认值,也可以在初始化方法中对其进行初始化 class Student : NSObject { var age : Int = 0 var name : String? = nil var mathScore : Double =

2020-08-19 22:34:30 1427

原创 类的定义

类的介绍和定义 Swift也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象 class 类名 : SuperClass{ // 定义属性和方法 } class是Swift中的关键字,用于定义类 注意 定义的类,可以没有父类,那么该类是rootClass 通常情况下,定义类时,继承自NSObject(非OC的NSObject) 创建类 class Person : NSObject{ var age : Int = 0 } 创建类对应的对象 let p = Person()

2020-08-19 22:33:58 157

原创 函数

介绍 函数相当于OC中的方法 函数的格式如下 func 函数名(参数列表) -> 返回值类型{ 代码块 return 返回值 } func是关键字,多个参数列表之间可以用逗号(,)分隔,也可以没有参数 使用箭头"->"指向返回值类型 如果函数没有返回值,返回值为Void,并且"->返回值类型"部分可以省略 常见的函数类型 1.没有参数,没有返回值 func about() -> Void{ print("iPhone12Pro") } about()

2020-08-16 23:03:11 154

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除