自定义博客皮肤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 149 1

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

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

2022-03-09 08:30:58 172

原创 set方法的本质

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

2022-03-09 08:30:32 366

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

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

2022-03-09 08:29:46 160

原创 类与对象的一个本质

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

2022-03-09 08:29:00 97

原创 isa指向

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

2022-03-08 09:14:12 143

原创 objc_object VS NSObject && objc_class VS Class

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

2022-03-08 09:06:28 3026

原创 联合体-结构体

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

2022-03-08 09:05:51 264

原创 内存对齐方式

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

2022-03-08 09:05:23 207

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

f : funcationT : typeof’#‘ : 宏定义s : struct

2022-03-07 08:27:37 2262

原创 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 2104

原创 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 180

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

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

2022-03-01 09:09:37 460

原创 alloc, init, new的区别

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

2022-03-01 09:03:12 78

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

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

2022-02-16 14:26:58 645

原创 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 2349

原创 视频播放

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

2020-11-29 11:41:15 426

原创 远程播放音乐

0.倒入框架import AVFoundation1.懒加载播放器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 407

原创 音乐播放

0.倒入框架import AVFoundation1.懒加载创建音乐播放器(并且直接设置一些属性)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 325

原创 音效播放

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

2020-11-26 21:06:32 146

原创 录音

0.倒入框架import AVFoundation1.懒加载录音对象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 78

原创 获取通讯录

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

2020-11-24 18:34:03 315

原创 应用间跳转

添加应用的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 422

原创 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 84

原创 摇一摇

实现方法即可摇一摇开始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 109

原创 加速计

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

2020-11-13 20:28:34 87

原创 距离传感器

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

2020-11-13 20:28:04 219

原创 本地通知

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

2020-11-13 20:27:36 163

原创 使用照片选择器

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

2020-10-07 18:27:35 155

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

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

2020-09-21 16:11:05 1876 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 361

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

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

2020-09-09 21:43:53 186

原创 如何书写一个类方法

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 190

原创 Swift中异常的处理方式

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

2020-09-06 21:34:51 264

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

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

2020-09-06 21:34:20 355

原创 类的属性监听器

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

2020-08-19 22:35:32 159

原创 自定义类的构造函数

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

2020-08-19 22:35:00 441

原创 类的属性定义

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

2020-08-19 22:34:30 1250

原创 类的定义

类的介绍和定义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 79

原创 函数

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

2020-08-16 23:03:11 88

空空如也

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

TA关注的人

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