自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(91)
  • 收藏
  • 关注

原创 【iOS】—— 循环引用问题

对象A和对象B,相互引用了对方作为自己的成员变量,只有当自己销毁时,才会将成员变量的引用计数减1,这就导致了A的销毁依赖于B的销毁,同样B的销毁依赖于A的销毁,这样就造成了循环引用问题。对象A内部强持有obj,对象B内部强持有obj,若此时对象A的obj指向对象B,同时对象B中的obj指向对象A,就是相互引用。对象N,每个对象中都强持有一个obj,若每个对象的obj都指向下个对象,就产生了多循环引用。假如有一个对象,内部强持有它的成员变量obj,若此时我们给obj赋值为原对象时,就是自循环引用。...

2022-08-18 10:19:13 1422

原创 【iOS】—— 响应者链和事件传递链

通过响应事件传递过来的新响应者,将这个事件的具体调用方法(即我们自定义的方法)传递给了这个新响应者,这样新响应者就实现了方法的调用,执行了我们自定义的方法。方法来作具体处理,然而这些方法默认都是不做处理的,但是我们要是想让该响应者响应该事件就可以重写一开始说的那几个响应事件方法,并且我们也可以在重写。这里我们扩大其响应范围,创建的button大小是不会变化的,变化的只是我们看不到的其可以响应的范围。通过这三种处理事件的方法就可以知道事件的整个过程,我们平时经常使用的就是触摸事件,其中有两个参数,......

2022-08-14 10:38:07 1390 1

原创 【iOS】——分类、扩展和关联对象

method_list_t 类型的【对象方法列表结构体】_method_list_t 类型的【类方法列表结构体】_protocol_list_t 类型的【协议列表结构体】_prop_list_t 类型的【属性列表结构体】注意结构体中并不包含类型,也就是不包含【成员变量结构体】。首先通过分类的结构体存储各个分类中的方法、协议、属性然后在运行期时候调用相关方法,再将分类结构体中的内容都存入相关的全局中,以cls为key,以列表为value最后再通过cls找到全局。......

2022-08-14 10:37:23 1384

原创 【iOS】—— autoreleasepool详解

总的来说,就是一个双向链表,链表中的每个节点是一个栈,栈中保存了指向的指针并且其中加入了需要自动释放池管理的对象,所以在中的所有对象引用计数都会+1,一旦出了,没有指针指向对象,对象的引用计数就会-1,ARC下,xcode会为代码自动添加。自动释放池是由以双向链表的方式实现的当对象调用方法时,会将对象加入的栈中调用方法会向栈中的对象发送release消息。......

2022-08-14 10:36:41 1624

原创 【iOS】—— RunLoop详解

一般来说,一个线程一次只能执行一个任务,执行完成后线程就会退出。就比如之前学OC时使用的命令行程序,执行完程序就结束了。而runloop目的就是使线程在执行完一次代码之后不会结束程序,而是使该线程处于一种休眠的状态,等待有事件需要处理的时候,再醒来处理。简单的来说,runloop可以让线程在需要做事的时候忙起来,不需要的时候让线程休眠,使程序不会结束。RunLoop需要处理的消息,包括time以及source消息,他们都属于Mode item。......

2022-08-09 18:46:48 2943

原创 【iOS】—— pthread、NSThread

使用C语言编写,需要程序员自己管理线程的生命周期,使用难度比极大,我们在iOS开发中几乎不适用pthread,但是我们可以来了解一下。NSThread 是苹果官方提供的,使用起来比 pthread 更加面向对象,简单易用,可以直接操作线程对象。不过也需要需要程序员自己管理线程的生命周期(主要是创建),我们在开发的过程中偶尔使用 NSThread。线程安全解决的方案:给线程加锁,在一个线程执行该操作的时候,不允许其他线程进行操作。就是这个用起来感觉太繁琐了,很古老,用了其他的再用这个感觉就是降维打击。...

2022-08-05 17:43:09 466 1

原创 【iOS】—— NSOperation、NSOperationQueue

我们可以通过自定义继承自NSOperation的子类,重写main或者start来定义自己的NSOperation对象。如果只是重写了main方法,有底层控制变更任务执行、完成状态以及任务退出。如果重写了start方法,需要自己控制任务状态。重写main方法比较简单,我们不需要管理线程的状态属性executing(是否正在执行)和finished(是否完成)。当main执行完返回的时候,这个操作就结束了。......

2022-08-05 17:42:40 834

原创 【iOS】—— 深入了解GCD

百度:Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。苹果官方:Grand Central Dispatch(GCD) 是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级实现。...

2022-08-05 17:42:04 955

原创 【iOS】—— 持久化

iOS中的沙盒机制是一种安全体系。为了保证系统安全,iOS每个应用程序在安装时,会创建属于自己的沙盒文件(存储空间)。应用程序只能访问自身的沙盒文件,不能访问其他应用程序的沙盒文件,当应用程序需要向外部请求或接收数据时,都需要经过权限认证,否则,无法获取到数据。所有的非代码文件都要保存在此,例如属性文件plist、文本文件、图像、图标、媒体资源等,其原理是通过重定向技术,把程序生成和修改的文件定向到自身文件夹中。......

2022-08-04 10:53:11 864

原创 【iOS】—— 通知、单例、代理以及设计模式总结

首先创建一个自定义文件,继承自NSObject,用作自定义通知的类,因为通知是可以实现多对多关系的,所以我们在这个类中还需要定义一个可变的字典属性,用来存储注册的通知。又因为注册的通知数据需要一直保存下来,所以我们使用单例来完成这一操作,保证我们在想要访问已经注册的通知的时候,其数据是存在的。............

2022-08-04 10:50:51 763

原创 【iOS】—— KVC与KVO

KVC的全称是,俗称“键值编码”,可以通过一个key来访问某个属性;KVC提供了一种间接访问其属性方法或成员变量的机制,可以通过字符串来访问对应的属性方法或成员变量;它是一个非正式的Protocol,提供一种机制来间接访问对象的属性,而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。KVO的全称是,俗称“键值监听",可以用于监听某个对象属性值的改变;KVO是苹果提供的在套事件通知机制。KVO和都是iOS中观察者模式的一种实现,区别。...

2022-08-03 13:03:38 1379

原创 【iOS】—— 六大原则和工厂模式

对这六个原则的遵守并不是是和否的问题,而是多和少的问题,也就是说,我们一般不会说有没有遵守,而是说遵守程度的多少。任何事都是过犹不及,设计模式的六个设计原则也是一样,制定这六个原则的目的并不是要我们刻板的遵守他们,而需要根据实际情况灵活运用。对他们的遵守程度只要在一个合理的范围内,就算是良好的设计。我们用一幅图来说明一下。图中的每一条维度各代表一项原则,我们依据对这项原则的遵守程度在维度上画一个点,则如果对这项原则遵守的合理的话,这个点应该落在红色的同心圆内部;如果遵守的差,点将会在小圆内部;.......

2022-08-03 13:01:30 963

原创 【iOS】—— weak的基本原理

1、weak的原理在于底层维护了一张结构的hash表,key是所指对象的地址,value是weak指针的地址数组。2、weak关键字的作用是弱引用,所引用对象的计数器不会加1,并在引用对象被释放的时候自动被设置为nil。3、对象释放时,调用函数根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。4、文章中介绍了SideTable、、这样三个结构,它们之间的关系如下图所示。httpshttps。......

2022-07-28 19:32:54 1352

原创 【iOS】—— 消息传递与转发

impimp。

2022-07-23 10:07:14 784

原创 【iOS】—— 对象的底层结构和继承者链(isa、class)

这里面其实利用位域存储数据,简单来说因为这个bits跟指针大小相同,在iOS中指针大小是8个字节,也就是64位,但是通常单一数据无法用满这64位的,会有很多空位,造成空间浪费。想要一个可以保存体系结构指针类型的整数类型的常见原因是对指针执行特定于整数的操作,或者通过将指针提供为整数“句柄”来模糊指针的类型。的类型,由代码中标注的出来的内存大小,可以算出最后计算出的cache类的内存大小为12+2+2=16字节。指针,那么也就是说明,每一个新定义的类,它对应的结构体中都会有一个这个。......

2022-07-20 20:26:53 658

原创 【iOS】—— 多线程编程八重曲之(三)- NSThread

是苹果提供的一种面向对象的轻量级多线程解决方案,一个对象代表一个线程,使用比较简单,但是需要手动管理线程的生命周期、处理线程同步等问题。类方法创建:实例方法创建:使用实例方法创建线程返回线程对象,可以根据需要设置相应属性参数。线程创建完毕后对应线程状态的,我们需要调用方法启动线程(使用类方法创建的线程隐式的启动了线程),否则线程是不会执行的。但是使用类方法创建或者使用实例方法创建并且调用方法之后,线程并不会立即执行,只是将线程加入可调度线程池,进入,具体何时执行需要等待的调度。示例:线程的创建和启动:

2022-06-18 15:00:19 719

原创 【iOS】—— 多线程编程八重曲之(二)- Pthread

pthread浅学

2022-06-09 17:54:39 575 1

原创 【iOS】—— 多线程编程八重曲之(一)- 多线程基础

简单介绍多线程的基础

2022-06-06 20:50:37 374

原创 【iOS】—— 分类、扩展和关联对象

一、分类与扩展的区别1、category类别(分类)专门用来给类添加新的方法。不能给类添加成员属性,添加了成员属性,也无法取到。【注意】:其实可以通过runtime给分类添加属性,即属性关联,重写setter、getter方法。分类中用@property定义的变量,只会生成变量的setter、getter方法的声明,不能生成方法实现和带下划线的成员变量。2、extension(类扩展)可以说成是特殊的分类,也可称作匿名分类。可以给类添加成员属性,但是是私有变量。可以给类添加方法,也是

2022-05-31 17:51:16 756

原创 剑指 offer (专项突击版)

剑指 Offer II 001. 整数除法//方法一:class Solution {public: int divide(int a, int b) { // 考虑被除数为最小值的情况 if (a == INT_MIN) { if (b == 1) { return INT_MIN; } if (b == -1) { ret

2022-05-26 19:59:02 398 2

原创 【iOS】—— 富文本实现超链接功能

我们经常会看到很多程序上会有超链接,并且我们点击之后会直接跳转到响应的网页界面,但是我们无法使用普通的UILabel来实现,而是使用UITextView来完成这个操作的,今天就来浅谈一下它的实现。一、UITextView详解:1.UITextView简单属性: //初始化UITextView UITextView *textview = [[UITextView alloc] initWithFrame:CGRectMake(40, 100, 300, 50)]; textview.

2022-05-24 17:17:38 3559 3

原创 【iOS】—— AFNetworking源码(3.2.1版本)(未完)

一、基础使用1.初始化:AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];在AFHTTPSessionManager类中所有的初始化方法最终都会调用到- (instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration方法:- (instancetype)initWithBas

2022-05-22 12:02:40 392

原创 【iOS】—— SDWebImage源码(5.9.5版本)

图片加载的主要流程

2022-05-14 20:22:02 792 2

原创 【iOS】—— typeof和typedef的爱恨情仇

我们平时经常使用typedef,但是前几天偶然我看到了typeof,第一眼还以为是我眼花了看错了,后来经过仔细的思考和查阅我才知道了这个关键字,下面简单介绍一下。一、typedeftypedef常用于命名(枚举和block),它的作用就是给一个变量起一个别名,而不只是简单的宏替换,就像这样:typedef NS_ENUM(NSInteger, UITableViewStyle) { UITableViewStylePlain, // regular table view

2022-05-08 16:19:21 1152 2

原创 【iOS】—— 内存的五大分区

平时我们编写程序的时候可能不太在意系统的内存问题,那么我们所编写代码变量都是怎么在内存中存取的呢?内存其实分为五大分区,栈区(系统管理的地方)、堆区(程序员控制的地方)、常量区(全局区)、静态区和代码区,下面我们来简单介绍介绍。首先我们要知道,这里说的内存指的就是RAM。一、五大分区1.栈区创建临时变量时由编译器自动分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。和堆一样,用户栈在程序

2022-05-01 13:07:56 1578

原创 剑指 Offer 浅刷浅刷(普通版)

剑指 Offer 09. 用两个栈实现队列class CQueue {public: stack <int> headStack; stack <int> rearStack; CQueue() { } void appendTail(int value) { headStack.push(value); } int deleteHead() { if

2022-04-25 21:11:01 1913

原创 【Objective-C 高级编程】—— 小小GCD

一、Grand Central Dispatch(GCD)概要1.什么是GCD

2022-04-22 17:44:04 418

原创 【Objective-C 高级编程】—— 初恋Blocks

一、基础1.定义:Blocks是带有自动变量(局部变量)的匿名函数。2.格式:^ 返回值类型 参数列表 表达式^int (int count){return count + 1;}其中的返回值类型和参数列表可以省略。3.Block类型变量声明:返回参数 (^变量名称)(接受参数);该用法就和平时变量的用法相同了,也可以进行赋值等操作。int (^blk)(int) = ^(int count) {return count + 1;};int (^blk_t)(int);blk

2022-04-17 14:18:13 2528

原创 【iOS】—— 浅谈UISearchController

UISearchController是iOS的一个系统的搜索控件,在平时我们输入信息的时候会出现相应的联想搜索的内容,然后通过UITableView展示到搜索框的下面,供我们选择。原本还想用UITextField来实现这个功能,人家现在有,那就浅学习一手。一、需要遵守的协议:因为它用到的UITableView所以一定是要用到UITableViewDelegate, UITableViewDataSource的,另外我们要实现其联想搜索功能还的遵守这两个协议UISearchControllerDelega

2022-04-13 19:53:58 1884

原创 【iOS】—— GET和POST

我们在使用网络请求获取数据的时候应该对get有一定的理解,顾名思义get是从服务器上获取数据,post是向服务器传送数据。前者把参数数据加在了将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节,后者则是将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。下面就来浅谈一下。一、浅谈概念HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源

2022-03-22 10:23:30 687 1

原创 【C++】—— 类构造函数 和 析构函数

在C++中还有我们之前没有接触过的函数和方法,那就是类的构造函数和析构函数,其实说上去这两个函数也很容易理解,一个是在类创建时调用,另一个是在类销毁或程序结束时调用的函数。一、类的构造函数1.一般构造函数:类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回void。构造函数可用于为某些成员变量设置初始值。说白了构造函数就是一个在创建类的时候类会自动调用的函数。看下面的例子就懂了,很简单:#include &

2022-03-17 12:02:21 183

原创 【C++】—— 引用(&)

在我们第一次学习C++的时候,我们会听到引用这个词,并且它的符号就像是我们之前学习C语言的&(取地址符),但是它在C++中还有另外的叫法,它叫做引用。引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。一、引用简介1.概念:引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。此时对引用的操作与对变量直接操作完全一样。2.引用声明的方法:类型标识符 &amp

2022-03-16 16:17:37 627

原创 【iOS】—— 获取设备唯一标识

一、UDID(Unique Device Identifier)UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它由40位16进制数的字母和数字组成(越狱的设备通过某些工具可以改变设备的UDID)。移动网络可利用UDID来识别移动设备,但是,从IOS5.0(2011年8月份)开始,苹果宣布将不再支持用uniqueIdentifier方法获取设备的UDID,iOS5以下是可以用的。苹果从iOS5开始就移除了通过代码访问UDID的权限。从2013年5月1日起

2022-03-12 18:33:15 4645 1

原创 【iOS】—— 自定义选择器

通常我们在使用很多软件的时候都会遇到选择日期或者性别之类的东西,其选择器非常的炫酷,今天我就来说说怎么自定义一个自己的选择器。一、UIDatePickerUIDatePicker就是系统为我们封装的一个选择器,继承于UIControl,它的用法非常简单,并且不需要遵守什么协议,我们只需要创建它,并且再选择它的类型就可以达到目的了,非常简单好用,就像下面这样:@property (nonatomic, strong) UIDatePicker *showDatePicker; //系统自带的选择器

2022-03-03 14:44:23 1186

原创 【iOS】—— 获取本机当前经纬度坐标位置和通过经纬度坐标测算距离

平时我们再写程序的时候经常会需要访问当前设备的位置信息和计算当前位置距某点的距离,下面我来为大家浅谈一下使用OC自带的库来获取当前坐标和其的距离计算。一、获取当前经纬度坐标步骤1:添加关键字首先要Info里添加两个键值对,向用户请求位置服务时会显示在这里设置的值的内容。<key>NSLocationWhenInUseUsageDescription</key><value>使用程序的时候获取本机位置</value><key>NSLoc

2022-02-24 15:33:37 6789 1

原创 【Effective Objective-C】—— 系统框架

第47条:熟悉系统框架编写OC应用程序的时候我们几乎都会用到系统框架,其中提供了很多我们经常使用的类,并且我们使用的系统框架也是会随着官方的更新而更新的。将一系列代码封装为动态库,并在其中放入描述其接口的头文件,这样做出来的东西就叫框架。我们经常使用的就是Foundation框架,像NSObject、NSArray等等的类都在其中。这个框架中的类通常都是以NS前缀开头的,此前缀是在OC语言用作NeXTSTEP操作系统的编程语言时首度确定的,这个框架基本上就可以说是OC应用程序的基础了。还有个与Fou

2022-02-16 16:47:08 1266

原创 【Effective Objective-C】—— 块与大中枢派发

开发应用程序时,最糟糕的事莫过于程序因UI线程阻塞而挂起了,在iOS系统中,阻塞过久可能会使应用程序终止执行,所幸苹果公司以全新的方式设计了多线程,并且当前多线程的核心就是“块”与“大中枢派发”,“块”是一种可在C、C++及OC代码中使用的“词法闭包”,GCD是一种与块有关的技术,它提供了对线程的抽象,而这种抽象则基于“派发队列”。块与GCD都是当前OC编程的基石,因此,必须理解其工作原理及功能。第37条:理解“块”这一概念块可以实现闭包,并且其是作为“扩展”而加入GCD编译器中的。1.块的基础知识

2022-02-13 02:55:09 341

原创 【Effective Objective-C】—— 内存管理

第29条:理解引用计数OC使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数器,如果某个对象引用他时就会给其引用计数加1,用完了之后,就递减其计数,直至为0,销毁这个对象。ARC实际上也是一种引用计数机制。1.引用计数工作原理:在引用计数架构下,对象有个计数器,用以表示当前有多少个事物想令此对象继续存活下去。NSObject协议声明了下面三个方法用于操作计数器:Retain 递增保留计数release 递减保留计数autorelease 待稍后清理“自动释放池”时,再递减

2022-01-25 14:41:28 2195

原创 【Effective Objective-C】—— 协议与分类

第23条:通过委托与数据源协议进行对象间通信1.委托模式:“委托模式”也就是我们通常说的代理,它是用来实现对象间的通信的,也就是传递数据。它的主旨是:定义一套接口,某对象若想接受另一个对象的委托,则需遵从此接口,以便成为其“委托对象”。而这“另一个对象”则可以给其委托对象回传一些信息,也可以在发生相关事件时通知委托对象。想必大家都很清楚委托了,这里也就不再过多赘述了。...

2022-01-20 17:03:05 2313

原创 【Effective Objective-C】—— 接口与API设计

第15条:用前缀避免命名空间冲突因为OC中没有其他语言那种内置的命名空间机制,所以我们在对文件命名时要十分的注意,若是发生重名冲突,那么应用程序相应的链接过程就会出错,导致运行文件不知道究竟该调用那个文件,因为其中出现了重复的符号。例如:这给错误就是因为something.o和something_else.o中都出现了各自实现的EOCTheClass类,导致编译器无法识别,而出错了。当然,不仅仅是类文件中可能出现这种错误,程序库中也可能出现这种错误,所以为了避免这种错误,我们唯一的办法就是自己手动的

2022-01-17 22:22:27 2272

空空如也

空空如也

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

TA关注的人

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