<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[LIN1986LIN的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/LIN1986LIN</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; LIN1986LIN]]></copyright><item><title><![CDATA[2020年阿里、字节：一套高效的iOS面试题]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/106358283</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/106358283</guid><author>LIN1986LIN</author><pubDate>Tue, 26 May 2020 16:01:40 +0800</pubDate><description><![CDATA[runtime相关(参考源码objc-runtime或objc4)

结构模型

1、介绍下runtime的内存模型（isa、对象、类、metaclass、结构体的存储信息等）

对象：OC中的对象指向的是一个objc_object指针类型，typedef struct objc_object *id;从它的结构体中可以看出，它包括一个isa指针，指向的是这个对象的类对象,一个对象实例就是通过这个isa找到它自己的Class，而这个Class中存储的就是这个实例的方法列表、属性列表、成员变量列表等相关信息的]]></description><category></category></item><item><title><![CDATA[iOS页面卡顿及性能优化思考]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/104950924</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/104950924</guid><author>LIN1986LIN</author><pubDate>Wed, 18 Mar 2020 18:44:48 +0800</pubDate><description><![CDATA[卡顿产生的原因

在屏幕成像的过程中，CPU和GPU的职责及

CPU：负责对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制（Core Graphics）。

GPU：负责变换、合成、纹理的渲染。

CPU 把计算好的数据给 GPU，GPU 来渲染，渲染后的数据放在帧缓存（缓冲区，有两块缓冲区，前帧缓存和后帧缓存，协调使用，效率高）中。然后，视频控制器...]]></description><category></category></item><item><title><![CDATA[玩转GitLab-CI+蒲公英可持续化全自动打包]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/94630180</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/94630180</guid><author>LIN1986LIN</author><pubDate>Thu, 04 Jul 2019 17:06:57 +0800</pubDate><description><![CDATA[1 gitlab-runner 安装

1.1 下载执行文件

# Linux x86-64
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

# Linux x86
sudo ...]]></description><category></category></item><item><title><![CDATA[Git常用命令速查表]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/89642620</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/89642620</guid><author>LIN1986LIN</author><pubDate>Sun, 28 Apr 2019 17:38:59 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[*** Assertion failure in +[PLManagedObjectContext __prepareEntityPropertyLookups]问题]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/89436561</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/89436561</guid><author>LIN1986LIN</author><pubDate>Sun, 21 Apr 2019 21:42:28 +0800</pubDate><description><![CDATA[如题，当程序崩溃报错为：*** Assertion failure in +[PLManagedObjectContext __prepareEntityPropertyLookups], /BuildRoot/Library/Caches/com.apple.xbs/Sources/PhotoLibraryServices_Sim/MobileSlideShow-3442.11.230/Sour...]]></description><category></category></item><item><title><![CDATA[对程序性能的优化归纳总结]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88566243</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88566243</guid><author>LIN1986LIN</author><pubDate>Fri, 15 Mar 2019 09:50:02 +0800</pubDate><description><![CDATA[1.使用复用机制

2.尽可能设置 View 为不透明

3.避免臃肿的 XIB 文件

4.不要阻塞主线程

5.图片尺寸匹配 UIImageView ，合理使用imageNamed 和 imageWithContentsOfFile

6.选择合适的容器

7.启用 GZIP 数据压缩

8.View 的复用和懒加载机制

9、缓存 服务器的响应信息（response）。 图片。 计算值。比如...]]></description><category></category></item><item><title><![CDATA[Runloop应用场景]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88566096</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88566096</guid><author>LIN1986LIN</author><pubDate>Fri, 15 Mar 2019 09:44:48 +0800</pubDate><description><![CDATA[1、AutoreleasePool

App启动后，苹果在主线程 RunLoop 里注册了两个 Observer，其回调都是 _wrapRunLoopWithAutoreleasePoolHandler()。

第一个 Observer 监视的事件是 Entry(即将进入Loop)，其回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池。其 order 是-2147...]]></description><category></category></item><item><title><![CDATA[如何判断当前线程是主线程]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88550365</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88550365</guid><author>LIN1986LIN</author><pubDate>Thu, 14 Mar 2019 12:08:16 +0800</pubDate><description><![CDATA[在开发应用程序时，我们异步请求数据处理后，需要回到主线程刷新UI，一般情况下直接通过以下方式异步回到主线程：


 dispatch_async(dispatch_get_main_queue(), ^{
    // 主线程刷新UI操作

  });


看过SDWebImage源码的应该看过它里面有这样一个宏：


#ifndef dispatch_main_async_s...]]></description><category></category></item><item><title><![CDATA[iOS主线程和主队列的区别]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88550303</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88550303</guid><author>LIN1986LIN</author><pubDate>Thu, 14 Mar 2019 12:03:02 +0800</pubDate><description><![CDATA[问题

第一题（主线程只会执行主队列的任务吗？）


letkey=DispatchSpecificKey()

DispatchQueue.main.setSpecific(key:key,value:&quot;main&quot;)

funclog(){
debugPrint(&quot;mainthread:\(Thread.isMainThread)&quot;)
letvalue...]]></description><category></category></item><item><title><![CDATA[对象、super、isa、class 和 SuperClass 的理解]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88547601</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88547601</guid><author>LIN1986LIN</author><pubDate>Thu, 14 Mar 2019 11:06:13 +0800</pubDate><description><![CDATA[super

super：是编译器指示符，仅仅是一个标志,并不是指针，仅仅是标志的当前对象去调用父类的方法，本质还是当前对象调用。


 super的本质:其实还是当前对象去调用,只不过让当前对象去调用父类方法， super不是父类对象,指的是父类方法。

superclass

superclass:获取方法调用者的父类

class

class:获取方法调用者的类对象



Q：OC中对...]]></description><category></category></item><item><title><![CDATA[OC中isKindOfClass与isMemberOfClass的区别，你真理解？]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88538986</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88538986</guid><author>LIN1986LIN</author><pubDate>Wed, 13 Mar 2019 19:03:28 +0800</pubDate><description><![CDATA[先给出官方介绍


	isKindOfClass：Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class.
	
	
	isMemberOfClass：Retur...]]></description><category></category></item><item><title><![CDATA[AFNetworking与SDWebImage简单阐述]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88529404</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88529404</guid><author>LIN1986LIN</author><pubDate>Wed, 13 Mar 2019 11:46:15 +0800</pubDate><description><![CDATA[1、AFNetworking 底层原理分析

AFNetworking主要是对NSURLSession和NSURLConnection(iOS9.0废弃)的封装,其中主要有以下类:
1). AFHTTPRequestOperationManager：内部封装的是 NSURLConnection, 负责发送网络请求, 使用最多的一个类。(3.0废弃)
2). AFHTTPSessionManager...]]></description><category></category></item><item><title><![CDATA[RunLoop问题简单阐述]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88529245</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88529245</guid><author>LIN1986LIN</author><pubDate>Wed, 13 Mar 2019 11:39:40 +0800</pubDate><description><![CDATA[1、什么是RunLoop?


	顾名思义:
	1、运行循环，在程序运行过程中循环做一些事情。
	2、iOS中有2套API来访问和使用RunLoop
	√ Foundation：NSRunLoop
	√ Core Foundation：CFRunLoopRef
	3、NSRunLoop和CFRunLoopRef都代表着RunLoop对象
	4、NSRunLoop是基于CFRunLoopRef的一层...]]></description><category></category></item><item><title><![CDATA[Block的循环引用解决方案理解]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88528980</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88528980</guid><author>LIN1986LIN</author><pubDate>Wed, 13 Mar 2019 11:35:07 +0800</pubDate><description><![CDATA[Block的循环引用原理和解决方法大家都比较熟悉，此处将结合上文的介绍，介绍一种不常用的解决Block循环引用的方法和一种借助Block参数解决该问题的方法。
Block循环引用原因：一个对象A有Block类型的属性，从而持有这个Block，如果Block的代码块中使用到这个对象A，或者仅仅是用用到A对象的属性，会使Block也持有A对象，导致两者互相持有，不能在作用域结束后正常释放。解决原理：对...]]></description><category></category></item><item><title><![CDATA[Runtime简单问题阐述]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88529144</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88529144</guid><author>LIN1986LIN</author><pubDate>Wed, 13 Mar 2019 11:34:38 +0800</pubDate><description><![CDATA[runtime 概念

Objective-C是基于 C 的，它为 C 添加了面向对象的特性。它将很多静态语言在编译和链接时期做的事放到了 runtime 运行时来处理，可以说runtime是我们 Objective-C 幕后工作者。

runtime（简称运行时），是一套 纯C(C和汇编写的) 的API。而 OC 就是运行时机制，也就是在运行时候的一些机制，其中最主要的是消息机制。

1、简述...]]></description><category></category></item><item><title><![CDATA[OC部分语法简单总结]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88527791</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88527791</guid><author>LIN1986LIN</author><pubDate>Wed, 13 Mar 2019 10:44:58 +0800</pubDate><description><![CDATA[1、一个NSObject对象占用多少内存？

系统分配了16个字节给NSObject对象（通过malloc_size函数获得）
	但NSObject对象内部只使用了8个字节的空间（64bit环境下，可以通过class_getInstanceSize函数获得）
2、对象的isa指针指向哪里？

instance对象的isa指向class对象
	class对象的isa指向meta-class对象
	m...]]></description><category></category></item><item><title><![CDATA[NSDictionary的实质和实现原理]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88526589</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88526589</guid><author>LIN1986LIN</author><pubDate>Wed, 13 Mar 2019 10:21:45 +0800</pubDate><description><![CDATA[一、NSDictionary使用原理

 1.NSDictionary（字典）是使用hash表来实现key和value之间的映射和存储的，hash函数设计的好坏影响着数据的查找访问效率。

  -(void)setObject:(id)anObjectforKey:(id&amp;lt;NSCopying&amp;gt;)aKey;

2.Objective-C中的字典NSDictio...]]></description><category></category></item><item><title><![CDATA[字典的KVC与setObject:forKey:,你了解多少？]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88525039</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88525039</guid><author>LIN1986LIN</author><pubDate>Wed, 13 Mar 2019 09:36:09 +0800</pubDate><description><![CDATA[我们在初始化一个可变字典之后，再给其添加键值对的时候可以使用字典的setObject:forKey:方法，或者使用kvc的方式。

setObject:forKey:

将给定的键值对添加到字典中


- (void)setObject:(ObjectType)anObject forKey:(id&amp;lt;NSCopying&amp;gt;)aKey



参数讲解：

anObject:


aKey的...]]></description><category></category></item><item><title><![CDATA[关于iOS 9之后通知的移除]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88524371</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88524371</guid><author>LIN1986LIN</author><pubDate>Wed, 13 Mar 2019 09:19:26 +0800</pubDate><description><![CDATA[为什么 iOS 9 之前需要手动移除观察者对象？

观察者注册时，通知中心并不会对观察者对象做 retain 操作，而是对观察者对象进行unsafe_unretained 引用。

什么是unsafe_unretained？因为 Cocoa 和 Cocoa Touch 中的一些类仍然还没有支持 weak 引用。所以，当我们想对这些类使用弱引用的时候，只能用unsafe_unretained来替代。...]]></description><category></category></item><item><title><![CDATA[Objective-C 对象存储在堆上而不是栈上 why？]]></title><link>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88292251</link><guid>https://blog.youkuaiyun.com/LIN1986LIN/article/details/88292251</guid><author>LIN1986LIN</author><pubDate>Thu, 07 Mar 2019 11:25:31 +0800</pubDate><description><![CDATA[一、什么是栈对象和堆对象

在Objective-C 中，对象通常是指一块有特定布局的连续内存区域。我们通常这样创建一个对象：

NSObject *obj = [[NSObject alloc] init];
这行代码创建了一个 NSObject 类型的指针 obj 和一个 NSObject 类型的对象，obj 指针存储在栈上，而其指向的对象则存储在堆上（简称为堆对象）。

目前 Object...]]></description><category></category></item></channel></rss>