
IOS开发学习点滴
文章平均质量分 67
忆江南的博客
精通iOS开发
展开
-
对组件化与模块化的思考与总结
前言前段时间反复研读了蘑菇街 App 的组件化之路、蘑菇街 App 的组件化之路·续和iOS应用架构谈 组件化方案,然后又找到了其它一些研究组件化、模块化方案的文章,但是总觉得差点什么,所以还是决定从头开始思考。文章的标题起的好宽泛,感觉给自己挖了个深坑-。-,其实只是自己对组件化、模块化的一些看法、总结。为什么先总结下为什么要大动干戈的对代码分模块、拆组件。代码量膨胀,不利于维护,更不利于新功能的开发现在随便开发一个App的代码行数都是数以万计的,如果不对代码做合理的拆分,那简直就转载 2021-09-29 10:47:04 · 478 阅读 · 0 评论 -
iOS应用的启动流程和优化详解
一、应用启动流程1、整体过程(1)解析Info.plist加载相关信息,例如如闪屏 沙箱建立、权限检查(2)Mach-O(可执行文件)加载dylib loading time(动态库耗时) rebase/binding time(偏移修正/符号绑定耗时)rebase(偏移修正):任何一个app生成的二进制文件,在二进制文件内部所有的方法、函数调用,都有一个地址,这个地址是在当前二进制文件中的偏移地址。一旦在运行时刻(即运行到内存中),每次系统都会随机分配一个ASLR(Address转载 2021-09-07 17:41:35 · 978 阅读 · 0 评论 -
weak 实现原理的概括
Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象指针的地址)数组。weak 的实现原理可以概括一下三步:1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的作用是更..原创 2021-09-03 11:18:22 · 219 阅读 · 0 评论 -
UI更新原理和卡顿原因
在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上。由于垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显...转载 2021-07-21 17:15:44 · 457 阅读 · 0 评论 -
Class-Protocol Router
定义一个protocol,叫protocolB,让BViewController实现。protocolB里面可以定义BViewController创建时需要的参数,例如这里的name和age。@protocol ProtocolB <NSObject>- (void)setBViewControllerName:(NSString *)name age:(int)age;@endBViewController实现protocolB#import "Protoco转载 2021-07-16 16:31:49 · 208 阅读 · 0 评论 -
CTMediator原理总结
这两天看了下CTMediator这个中间件,网上说的文章很多,但没有比较具体的总结实现方式。其实这个是中介者模式的一种实现。其实这个CTMediator不光用来做路由,还可以用在不同模块,不同类之间通信,而且不会耦合,不会引入依赖。总结CTMediator是实现原理吧,假设现在有这样一个场景,A类要跳转到B类,并且传参数给B类。实现思路是:A与CTMediator交互,CTMediator与B交互。CTMediator通过NSInvocation做了最核心的消息触发、转发。首先.原创 2021-07-15 16:25:50 · 1071 阅读 · 0 评论 -
constructor和load
constructor 和 +load 都是在 main 函数执行前调用,但 +load 比 constructor 更加早一丢丢,因为 dyld(动态链接器,程序的最初起点)在加载 image(可以理解成 Mach-O 文件)时会先通知 objc runtime 去加载其中所有的类,每加载一个类时,它的 +load 随之调用,全部加载完成后,dyld 才会调用这个 image 中所有的 constructor 方法。所以 constructor 是一个干坏事的绝佳时机:所有Class都已经加载完成原创 2021-07-14 15:01:04 · 229 阅读 · 0 评论 -
AssociationsManager
关联对象实际上是使用AssociationsManager这个全局变量的hashMap储存在内存中,并不是存储在关联对象的内存中:AssociationsManagerAssociationsHashMapObjectAssociationMapObjcAssociation关联对象的存储结构面试参考答案关联对象是线程安全的么?是线程安全的因为关联对象的值是储存在一个全局的AssociationsManager中的AssociationsHashMap hashM.转载 2021-07-13 11:17:13 · 464 阅读 · 0 评论 -
全网最透彻HTTPS(面试常问)
每篇文章都希望你能收获到东西,这篇将带你深入 HTTPS 加解密原理,希望看完能够有这些收获: 明白 HTTPS 到底解决了什么问题 理解对称加密与非对称加密的原理和使用场景 明白 CA 机构和根证书到底起了什么作用 Why HTTPS近几年来,各大公司都在大力推进 HTTPS 的建设。Google Chrome将非 HTTPS 的网站标注为「不安全」,苹果要求 APP 中需要使用HTTPS进行通信,微信小程序也要求使用HTTPS协议。那么,我们为什么非要做这么一件事呢?转载 2021-07-08 10:56:42 · 454 阅读 · 0 评论 -
page fault
由于虚拟内存的机制,应用启动时不会把所有数据加载到内存,而是以页为单位逐步从磁盘中加载,内存中的虚拟地址和磁盘中的物理地址有个映射关系。当程序执行时,如果发现要访问的东西不在内存里,就会触发一次page fault ,去磁盘中加载新的一页。启动阶段有很多方法要调用,而这些方法在Mach-O中的位置又是在编译时确认的。如果有10个方法刚好在不同页,可能就要产生10次page fault 。二进制重排要做的就是将启动阶段要用到的方法,在编译时提前确定,通过.order文件告诉编译器,这样这些方法会排布在转载 2021-06-30 17:04:21 · 705 阅读 · 0 评论 -
dyld
dyld 是启动的辅助程序,是 in-process 的,即启动的时候会把 dyld 加载到进程的地址空间里,然后把后续的启动过程交给 dyld。dyld 主要有两个版本:dyld2 和 dyld3。dyld2 是从 iOS 3.1 引入,一直持续到 iOS 12。dyld2 有个比较大的优化是dyld shared cache,什么是 shared cache 呢?shared cache 就是把系统库(UIKit 等)合成一个大的文件,提高加载性能的缓存文件。iOS 13 开始 Apple 对原创 2020-10-28 15:41:04 · 588 阅读 · 0 评论 -
关于bool,int类型变量使用atomic/nonatomic属性修饰的分析
原子性指一个或多个操作在CPU执行的过程不被中断的特性。原子性问题产生的源头是线程切换,而线程切换依赖于CPU中断。long 型变量是 64 位,在 32 位 CPU 上执行写操作会被拆分成两次写操作,写高 32 位和写低 32 位。64位机器上不会有这个问题。bool 只占一个字节 不会出现非原子操作。只要读写的内存长度小于等于地址总线的长度,那么读写的操作就是原子的。如果读写(load or store)的内存长度小于等于地址总线的长度,那么读写的操作是原子的,一次完成。比如bool,i.原创 2020-08-11 09:46:37 · 611 阅读 · 0 评论 -
attribute的理解
attribute 是编译器给符号关联的一些属性标记,编译器/链接器可以根据这些标记,产生特定的行为原理就是让编译器帮你生成一些代码比如 availability 属性,读到这个标记,编译器就可以给你提供版本兼容的警告再比如 always_inline 属性,读到这个标记,代码生成阶段就会强制内联实现 load 的是一个叫做 constructor 的属性,读到这个属性,链接器就会把这个函数加到 mod_init_funcs 里去load优先于attribute执行。...原创 2020-07-15 17:22:07 · 365 阅读 · 0 评论 -
swift-依赖倒置
面向对象开发中非常重要的一个原则,在大型的项目的开发中,通常都会采用分层的方式进行开发,即上层调用下层,上层依赖于下层,这样就是产生上层对下层的依赖。当下层设计产生变动时,上层代码也需要跟着做调整,这样会导致模块的复用性降低,这样大大的提高了开发成本。例如网络层面向对象编程中最大的优势在于起方便的对问题进行抽象,一般起概况下抽象层很少产生变化。依赖倒置原则的定义就是:高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。由于都对接口进行依赖,减少了类之间的耦合。转载 2020-07-14 16:33:47 · 227 阅读 · 0 评论 -
IOS学习笔记37——ViewController生命周期详解
http://blog.youkuaiyun.com/ryantang03/article/details/8264072在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它。ViewController是IOS开发中MVC模式中的C,ViewController是view的c转载 2014-07-16 23:18:22 · 529 阅读 · 0 评论 -
关于document,bundle,沙盒的一些看法
别笑我啊,有的时候真容易把这些搞混淆了,自己经历过,知道那种模棱两可的感觉,所以写出来总结一下一步一步的说:先说沙盒:使用NSHomeDirectory()方法获得的路径的最后一部分代表你的沙盒。例如:home /UsersLibrary/Application Support/iPhone Simulator/4.2/Applications/E25B转载 2014-07-16 17:22:27 · 806 阅读 · 0 评论 -
iOS 类别和扩展(Categories和Extensions)
分类(Category) 分类能够做到的事情主要是:即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。 此外,分类能够保证你的实现类和其他的文件区分开。 1 #import “UIViewController.h”2 @interface UIViewController(CustomView)3 -(void)extMeth转载 2014-07-16 23:19:33 · 481 阅读 · 0 评论 -
成员变量与属性存取器(Accessor)命名原则
一直不懂为什么很多代码里面类成员变量出现了下划线"_",而属性存取方法@property声明时不加下划线,实现时@synthesize又令两个名字相等。 @interface SunnyTest : NSObject { NSArray * _array; }@property (nonatomic,retain) NSArray * array;@end原创 2014-06-29 08:49:34 · 861 阅读 · 0 评论 -
IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
网上流传了太多关于合并lib库的方法,自己也尝试过,但大多失败。有感于这种急于解决问题,经过百般尝试后依旧无果的无奈心情,小翁在这里用一个实例来完整阐述如何在mac中合并lib静态库。这里以移动广告平台多盟的三个lib库为例子,之所以以此为例子,是因为我也遇到了库冲突的问题,所以才有了本文的内容。本文的目标:合并libDomobOfferWallSDK.a、libDomobAdWa原创 2014-07-23 14:27:24 · 828 阅读 · 2 评论 -
工程链接静态库的时候,通过删除class来解决重复的符号的错误
工程链接静态库的时候,通过删除class来解决重复符号(duplicate symbol)的错误 如果你在工程中使用静态库,并且指定了编译选项为-all_load(为了让Objective-C的类别加载正确),静态库中,你的工程包含了一样的class名字,或者跟其他静态库中,有相同的class名字。在链接静,肯定遇到过类似于这样的错误“duplicate symbol”错误。转载 2014-07-23 11:21:05 · 752 阅读 · 0 评论 -
File's Owner的理解
1. XIB文件的理解 通过IB设计的CnView和EnView分别对应一个XIB文件,在CnView的XIB文件中,主要采用XML格式描述了Button和Label控件的属性(这里不考虑View本身的背景等属性),有个Button和Label,以及Button和Label的位置、大小等。EnView的XIB文件类似。2. ViewController 每个V原创 2014-07-04 21:22:11 · 1727 阅读 · 1 评论 -
Objective-C中私有方法的声明
引入在Objective-C中.h文件声明的方法都为公有方法,那么如何声明私有方法呢?下文将简单介绍。 实现ü 比如有一个名称为:“GCUInfoIndexController”的类,我们在其.m文件中声明如下:#import "GCUInfoIndexController.h" @inter原创 2014-07-10 12:42:09 · 1085 阅读 · 0 评论 -
代码实现 UITableView与UITableViewCell
我们常用的表格类视图就是用 UITableView与UITableViewCell,UITableViewController继承UIViewContoller,所以只要很少代码就可以显示一个视图,UITableViewController也是UIScrollView子类,所以也有上下滑动效果 ;UITableView和UITableViewCell不能储存数据,可以用来显示特定行数内的数据,而且转载 2014-07-28 14:51:45 · 558 阅读 · 0 评论 -
UITableViewCell的标记、移动、删除、插入
http://blog.youkuaiyun.com/duxinfeng2010/article/details/7725897 这篇文章是建立在 代码实现 UITableView与UITableViewCell基础上进行修改,用不上的代码我注释调,部分不明白可以看看上篇博客;实现的功能是对UITableViewCell的标记、移动、删除、插入;1.标记:指的是选中某一行,在转载 2014-07-28 14:50:44 · 533 阅读 · 0 评论 -
Object-c 单例模式中的 allocWithZone作用
最近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了。。不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?于是阿堂从网上一搜,发现“ Objective-C的singleton模式 ”一文被很多人转载了,其主要内容如下Apple官方建议 由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的转载 2014-07-15 11:05:43 · 457 阅读 · 0 评论 -
IOS开发:关于performSelectorXXX的延迟的使用
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;这个方法是单线程的,也就是说只有当前调用次方法的函数执行完毕后,selector方法才会被调用。比如:- (void)changeText:(NSString *)st转载 2014-08-19 15:07:54 · 420 阅读 · 0 评论 -
iOS应用程序生命周期各个函数方法详解
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]原创 2014-08-11 21:26:14 · 633 阅读 · 0 评论 -
IOS CGAffineTransform 用于视图平移,放缩,旋转
CGAffineTransform今天碰到了一个旋转放缩图片的一个demo,在看的过程中发现实现图片变化的那个方法特别简单。一共只有三句话,下面就是这个方法- (void)transformImageView{CGAffineTransform t = CGAffineTransformMakeScale(scale * previousScale,scale * pr原创 2014-08-24 21:54:30 · 968 阅读 · 0 评论 -
iOS屏幕旋转学习笔记
(ccy.51ddns.net,192.168.1.6,192.168.1.150,192.168.1.7,192.168.1.7,192.168.1.7)转载 2014-08-14 15:43:28 · 524 阅读 · 0 评论 -
解决键盘遮挡输入框(UITextField)问题
在IOS开发中,如果输入框(UITextFiled)在界面的下半部分,那么,当键盘出现的时候,势必会挡住输入框,就下下面这样: 这样的效果造成了很不好的用户体验,在这一点上,Android或许就做的好一点,在Android中,只要有输入框的地方,不管E转载 2014-08-17 14:49:11 · 759 阅读 · 0 评论 -
IOS学习笔记40——苹果推送机制APNs(一)
推送是解决轮询所造成的流量消耗和电量消耗的一个比较好的解决方案,在Android上,虽然Google提供了GCM(之前为C2DM),但在国内基本等于没用,各大Android应用基本都自己架设推送Server或是使用第三方推送平台,例如新浪微博使用第三方推送平台“个推”(非广告)。今天要学习的是苹果提供的推送服务APNs(Apple Push Notification services)基本原理转载 2014-09-13 10:21:08 · 756 阅读 · 0 评论 -
IOS学习笔记41——苹果推送机制APNs(二)
上一篇介绍了一下APNs的基本原理和处理流程,通过介绍,对APNs的机制有了大致的了解后,我们就来看看如何把APNS服务集成到我们自己的项目中来,首先登陆我们的Apple Developer后台为将要使用推送服务的App新建一个App ID,如下图,点击新建后输入基本信息:新建完毕后找到我们刚申请的App ID,把“Enable for Apple Push Not转载 2014-09-13 10:19:50 · 536 阅读 · 0 评论 -
ios视图切换之push与present混用
在变成过程中,经常遇到两个视图控制器之间的切换,导航控制器即UINaVigation是最常用的一种,有时为了某些效果又需要进行模态切换,即present。我们的布局经常是在window上加一个nav,然后以viewControl作为nav的根视图进行导航。如果在导航之间有了一个present之后,你会发现当前页面的navigationController是空的,也就是说导航控制器不管用了,转载 2014-08-19 14:50:02 · 1107 阅读 · 2 评论 -
沙盒和bundle 的理解
NSBundle is used to access resources within your application itself: that is, everything inside YourApp.app. ThedocumentsDirectory is a location outside of your app -- it's in the "home directory" w原创 2014-08-19 11:11:23 · 3196 阅读 · 0 评论 -
UITableView and presentViewController takes 2 clicks to display
After much more debugging, I was able to determine it wasn't the view controller, but something to do with the the didSelectRowAtIndexPath and presentViewController. It started happening to other view原创 2014-08-19 15:12:30 · 977 阅读 · 0 评论 -
表视图默认选中第一个cell以及button外沿特性设置
今天做项目过程中碰到的问题1、设置按钮的边缘用到的方法是[submint_check_code_btn.layer setborderWith:1.0f] //设置button 的外沿[submint_check_code_btn.layer setborderColor] //设置button 的外沿的颜色2、进入表视图, 默认选中第一个cell原创 2014-09-02 21:25:16 · 867 阅读 · 0 评论 -
带有导航栏的视图坐标计算与详细分析
今天项目开发过程中,碰到了要将一个UIIndicator原创 2014-09-04 15:23:38 · 1202 阅读 · 0 评论 -
NSNotification、delegate和KVO的区别
1.效率肯定是delegate比nsnotification高。2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含 should这个很传神的词。也就是好比你做我的delegate,我会原创 2014-11-13 22:36:20 · 505 阅读 · 0 评论 -
对Viewcontroller在UINavigationController中入栈出栈的理解
wait_record_arr 在viewdidload里面被alloc,如果push进入下一个页面,再返回,wait_record_arr还是存在的,wait_record_arr的指针还是之前的那个值,viewdidloa如果是这个cloudVideoViewcontroller 被pop出去,再进入,wait_record_arr又要被alloc原创 2014-11-14 15:15:33 · 2966 阅读 · 0 评论 -
UITableView高度自适应
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // 列寬 CGFloat contentWidth = self.tableView.frame.size.width; // 用何種字體進行顯示 UIFont *font = [UIFont s原创 2014-10-13 12:30:55 · 538 阅读 · 0 评论