重-虫 不要写重复代码,重复代码要使用重构工具提取重构。...循-勋 不要在循环中调用服务,不要在循环中做数据库等跨网络操作; 频-品 写每一个方法时都要知道这个方法的调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高的一定要考虑性能指标,考虑是否会打垮数据库...,是否会击穿缓存; 异-宜 异常处理是程序员最基本的素质,不要处处捕获异常,对于捕获了只写日志,没有任何处理的catch要问一问自己,这样吃掉异常,是否合理; 下面是一个反例, 在导出文件的controller...方法中做了两层的try...catch, 在catch块中记录日志后什么都没做, 这样用户看不到真正想要的内容, 研发也只有看日志才能发现错误, 而“看日志”, 通常只有业务方反馈问题时才会看, 就会导致研发人员发现错误会比现场人员还会晚...日-日 打印日志和设定合理的日志级别,如有必要要添加if条件限定是否打印日志,在日志中使用JSON序列化,生成长字符串的toString()都要做if限定打印,否则配置的日志级别没达到,也会做大量字符串拼接
的环境下,而OC实现ARC就是编译时添加retain和release的方法。...2同时运行objc_storeStrong,他们会同时拿到oldValue,此时retainCount都为1;当2个线程执行完赋值操作,都会对oldValue进行release操作,此时就会触发对象的重复...NSArray的多线程问题 有一个经典问题:NSArray是否为线程安全类,能否用atomic修饰NSArray属性保证属性的读写线程安全吗?...我们能保证NSArray类的线程安全,但是无法保证NSArray内的属性操作是线程安全,所以在使用NSArray时,仍需要小心多线程问题。 思考题?: 为什么题目3可以正常运行?...附录 Thread Safety Summary objc_storeStrong objc_setProperty_atomic 一次标签指针(Tagged Pointer)导致的事故
类型的,使用copy是正确的; ·array2 是 NSMutableArray类型的,使用strong 是正确的; ·array3 是 NSMutableArray类型的,使用了copy,可能会导致问题...,却也跟着arrayM改变了 喜欢在NSArray上使用strong 修饰的朋友看过来了!!...使用copy 修饰 NSArray ,会copy一份新的内存地址,不会出现上述情况!...关键点来了:你遇到过NSMutableArray 添加对象的时候,失效的问题吗!...所以这里本质是给一个不可变的数组(NSArray 添加对象)肯定报错 ---- 第三步:改第二步,使用mutableCopy实现 NSArray ->转 NSMutableArray 没有添加成功 关键问题来了
为此,我们可以分 别获取名单中的每个名字,但这种做法会导致多个问题。例如,如果名单很长,将包含大量重复 的代码。另外,每当名单的长度发生变化时,都必须修改代码。...4.1.2 在 for 循环中执行更多的操作 在for循环中,可对每个元素执行任何操作。下面来扩展前面的示例,对于每位魔术师,都 打印一条消息,指出他的表演太精彩了。...在for循环后面,没有缩进的代码都只执行一次,而不会重复执行。下面来打印一条向全体 魔术师致谢的消息,感谢他们的精彩表演。...例如,你可能使用for循 环来初始化游戏——遍历角色列表,将每个角色都显示到屏幕上;再在循环后面添加一个不缩进 的代码块,在屏幕上绘制所有角色后显示一个Play Now按钮。...试图在循环中执行多项任 务,却忘记缩进其中的一些代码行时,就会出现这种情况。
在此之前在和讯网负责股票基金行情系统的研发工作,具备高并发、高可用互联网应用研发经验。 贾言验幻空越重, 命循频异长。 依轮线日简, 接偶正分壮。言欢空月虫, 明勋品宜昌。...,重复代码要使用重构工具提取重构 命循频异长 - 明勋品宜昌 命: 包 / 类 / 方法 / 字段 / 变量 / 常量的命名要遵循规范,要名副其实, 这不但可以增加可读性,还可以在起名的过程中引导我们思考方法...循: 不要在循环中调用服务,不要在循环中做数据库等跨网络操作 频: 写每一个方法时都要知道这个方法的调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高的一定要考虑性能指标,...考虑是否会打垮数据库,是否会击穿缓存 异: 异常处理是程序员最基本的素质,不要处处捕获异常,对于捕获了只写日志,没有任何处理的 catch 要问一问自己,这样吃掉异常,是否合理 下面是一个反例, 在导出文件的..., 就会导致研发人员发现错误会比现场人员还会晚。
如果集合中有非集合元素,会导致Crash。 在使用嵌套运算符时,如果有任何操作的对象为nil, 则valueForKeyPath:方法将引发异常。...添加一个分类,并定义一个_medianForKeyPath:方法,用来获取NSArray中的中位数。...非对象值处理 KVC支持基础数据类型和结构体,在使用KVC进行赋值或取值的时候,会自动在非对象值和对象值之间进行转换。...注意: 此步骤中描述的机制比上一步的效率低得多,因为它可能重复创建新的集合对象,而不是修改现有的集合对象。因此,在设计自己的键值编码兼容对象时,通常应该避免使用它。...相关面试题 Q:通过 KVC 修改属性会触发 KVO 吗? 会,通过KVC修改成员变量值也会触发KVO。 Q:通过 KVC 键值编码技术是否会破坏面向对象的编程方法,或者说违背面向对象的编程思想呢?
基于这个前提,轮循调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮循,即使这个服务器已经不能再处理当前这个请求了。...这可能导致能力较弱的服务器超载。 ?...这意味着在服务器B接收到第一个请求之前前,服务器A会连续的接受到2个请求,以此类推。...值得注意的是,在流量率低的配置环境中,各服务器的流量并不是相同的,会优先考虑第一台服务器。...然而,在流量非常低的环境下,服务器报上来的负载值将不能建立一个有代表性的样本;那么基于这些值来分配负载的话将导致失控以及指令震荡。因此,在这种情况下更合理的做法是基于静态的权重比来计算负载分配。
在Objective-C语言中,当然也有这方面的支持,词典对象就是做这个事情的,不过在同一个词典对象中可以保存多个不同类型的数据,不像Java与C只能保存声明的相同类型的数据,这一点还是可以解决不少问题的...,动态的添加数据如果超过10这个词典长度会自动增加,所以不用担心数组越界。 [NSMutableDictionary initWithCapacity:10] :只是初始化一个词典的长度为10。...迭代的变量在每次循环中为声明的对象设置 。当循环结束时,迭代的变量被设为 nil 。要是循环提前结束,那么迭代变量被遗弃,指向最后迭代的对象。...在 Foundation 框架中的集合类—NSArray, NSDictionary 以及 NSSet—就采用了这个协议,就像 NSEnumerator....很显然,在 NSArray 和 NSSet 中,枚举是针对它们的内容。对于其它的类,响应的文档应当明确哪个属性是用来迭代的。
前言 在iOS开发过程中,有些时候会用到去重处理,也就是去掉重复的元素或者个数,然后再进行排序处理,这就使用到了集合(NSSet),它其实是一种哈希表,通过运用散列算法来查找集合中的元素。...集合和数组的相同点:都是存储不同元素的地址,不同点:NSSet中的元素都是被自动过滤之后的不会重复的元素,NSArray中的元素却是允许重复的;NSSet是一个无顺序的集合,NSArray是一个有顺序的集合...相对来说,NSSet的处理效率比NSArray的要快。 本节内容就来简单的介绍一下NSSet的使用,并且会举一个实际使用案例来展示。...一、基本常用的方法 (一)NSSet 1、集合初始化: NSSet在初始化的时候,赋值的时候如果放入两个相同元素的话,会自动删除其中一个相同的元素。...[mSet1 addObject:@“5”]; [mSet1 addObject:@“6”]; [mSet1 addObject:@“6”]; //如果添加的元素有重复,实际情况只保留一个相同的元素
基于这个前提,轮循调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮循,即使这个服务器已经不能再处理当前这个请求了。...这可能导致能力较弱的服务器超载。...这意味着在服务器 B 接收到第一个请求之前,服务器 A 会连续的接收到 2 个请求,以此类推。...值得注意的是,在流量率低的配置环境中,各服务器的流量并不是相同的,会优先考虑第一台服务器。...然而,在流量非常低的环境下,服务器报上来的负载值将不能建立一个有代表性的样本;那么基于这些值来分配负载的话将导致失控以及指令震荡。 因此,在这种情况下更合理的做法是基于静态的权重比来计算负载分配。
bIMP, bIMP -> aIMP 坑点1:method-swizzling使用过程中的一次性问题 所谓的一次性就是:mehod-swizzling写在load方法中,而load方法会主动调用多次,这样会导致方法的重复交换...// 交换自己没有实现的方法: // 首先第一步:会先尝试给自己添加要交换的方法 :personInstanceMethod (SEL) -> swiMethod(IMP)...imp中 method-swizzling的应用 method-swizzling最常用的应用是防止数组、字典等越界崩溃 在iOS中NSNumber、NSArray、NSDictionary等这些类都是类簇...这样会导致方法交换无效 + (void)load{ Method fromMethod = class_getInstanceMethod(objc_getClass("__NSArrayI")...这样会导致方法交换无效 - (id)cjl_objectAtIndex:(NSUInteger)index{ //判断下标是否越界,如果越界就进入异常拦截 if (self.count-
用法 先给要替换的方法的类添加一个Category,然后在Category中的+(void)load方法中添加Method Swizzling方法,我们用来替换的方法也写在这个Category中。...方案 给按钮添加分类,并添加一个点击事件间隔的属性,执行点击事件的时候判断一下是否时间到了,如果时间不到,那么拦截点击事件。 怎么拦截点击事件呢?...类簇 在iOS中NSNumber、NSArray、NSDictionary等这些类都是类簇(Class Clusters),一个NSArray的实现可能由多个类组成。...抽象工厂内部有很多其它继承自当前类的子类,抽象工厂类会根据不同情况,创建不同的抽象对象来进行使用。...所以如果我们对NSArray类进行Swizzling操作其实只是对父类进行了操作,在NSArray内部会创建其他子类来执行操作,真正执行Swizzling操作的并不是NSArray自身,所以我们应该对其
NSArray代表有序可重复的集合;NSSet代表无序不可重复的集合;NSDictionary代表具有映射关系的集合。显然,这三类集合分别对应这Java中的List、Set和Map。 ...一、数组(NSArray与NSMutableArray) 1、NSArray代表元素有序、可重复的一个集合,集合中每个元素都有其对应的顺序索引。...NSArray集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。...来创建NSArray 参考NSArray类的文档,可以看到NSArray集合的方法大致包含如下几类: 查询集合元素在NSArray中的索引,即下标 根据索引值取出NSArray集合中的元素 对集合元素整体调用方法...NSMutableOrderedSet在NSOrderedSet的基础上增加了添加元素、删除元素、替换元素、集合排序,以及计算集合的交、并、差等功能。
重复移除多次,移除次数多于添加次数,导致崩溃。 重复添加多次,虽然不会崩溃,但是发生改变时,也同时会被观察多次。 被观察者提前被释放,被观察者在 dealloc 时仍然注册着 KVO,导致崩溃。...添加观察者时:通过关系哈希表判断是否重复添加,只添加一次。 移除观察者时:通过关系哈希表是否已经进行过移除操作,避免多次移除。...[self testKVOCrash11]; // 1.2 重复移除多次,移除次数多于添加次数,导致崩溃 // [self testKVOCrash12]; // 1.3...重复添加多次,虽然不会崩溃,但是发生改变时,也同时会被观察多次。...[self.objc removeObserver:self forKeyPath:@"name"]; } /** 1.2 重复移除多次,移除次数多于添加次数,导致崩溃 */ - (void)testKVOCrash12
检测全局对象引用耗时较高(约2-3s),在子线程进行 @property(nonatomic, assign) BOOL checkGlobalRetain; /// 添加自定义的全局对象,默认为`nil...; /// 添加白名单类名 - (void)addClassNamesToWhiteList:(NSArray *)classNames; /// 添加白名单对象。...在iOS开发中最常遇到的内存泄漏类型有: 存在循环引用,导致对象无法释放 被全局对象(如单例)持有,导致对象无法释放 (非ARC管理的对象)没有主动释放 本文主要介绍前两种内存泄漏的检测,第三种内存泄漏问题不在本文的讨论范围内...如果不借助其他工具,我们只能 对着相关代码一行行看 重复出问题的场景,在 Xcode 的 Memory Graph 中定位该对象。 显然,这两种方案都不够优雅,费时费力,还不一定能找到问题。...等等,这不是和 FBRetainCycleDetector 的检测机制差不多吗?有没有办法复用 FBRetainCycleDetector 的检测逻辑呢? 好像不行,因为此时并没有出现循环引用?
通过这个过程的分析,我们可能会猜到,我们执行的主线程一定是在一个死循环中,没有任务的时候进行休眠,接收到任务后被激活执行任务。...runloop中 - (void)addPort:(NSPort *)aPort forMode:(NSString *)mode; 添加输入源端口到runloop中,NSPort对象可以理解为详细的载体...,会传递消息与其代理。...runloop中后,runloop会设置一个一个的时间点进行调用,比如10,20,30。...runloop做什么操作,那是因为主线程的runloop默认是开启运行的,如果我们在分线程中也需要重复执行某一动作,如下: - (void)viewDidLoad { [super viewDidLoad
循环语句 1.1 循环概述 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环 体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false...,从而结束循 环,否则循环将一直执行下去,形成死循环。...具体执行的语句 ④循环后,循环变量的变化情况 输出10次HelloWorld do...while 循环的特点:无条件执行一次循环体,即使我们将循环条件直接写成 false ,也依然会循...1.6 跳出语句 break 使用场景:终止 switch 或者循环 在选择结构 switch 语句中 在循环语句中 离开使用场景的存在是没有意义的 continue 使用场景...扩展知识点 2.1 死循环 死循环: 也就是循环中的条件永远为 true ,死循环的是永不结束的循环。例如: while(true){} 。
,如下例: var name = 'eveningwater'; //错误,不能重复声明 const name = 'loho'; 但也可以在不同作用域中重复声明,如下例: var name = 'eveningwater...如下: for(let i = 0;i < 100;i++){ //执行某些操作 } //报错 console.log(i); 6.循环中的创建函数 在使用var声明变量的循环中,创建一个函数非常的困难...由于函数有自己的作用域,因此在向数组中添加函数的时候,实际上循环已经运行完成,因此每次打印变量i的值都相当于是在全局中访问变量i的值,即i = 5这个值,因此实际上答案最终会返回5次5....在es5中,我们可以使用函数表达式(IIFE)来解决这个问题,因为函数表达式会创建一个自己的块级作用域。...for-of循环是es6的新增的循坏。。 7.全局作用域绑定 let,const声明与var声明还有一个区别就是三者在全局作用域中的行为。
1.2 KVO KVO Crash常见原因: 移除未注册的观察者 重复移除观察者 添加了观察者但是没有实现-observeValueForKeyPath:ofObject:change:context...以NSArray越界为例,hook objectAtIndex方法,在方法中捕获越界异常,并在最后返回一个nil对象。...添加移除keypath=nil:hook添加移除观察者的方法,在新方法中过滤keypath=nil的情况。...添加移除observer=nil:hook添加移除观察者的方法,在新方法中过滤observer=nil的情况。...默认情况下,对象接收到未知的消息,会导致程序崩溃。
为什么还需要开启消息循坏 使用子线程更新UI有实际应用场景吗 Android为什么不能在子线程更新UI? // Android中为什么子线程不能更新UI?...由于网络延时或者大量耗时操作,会使UI绘制错乱,出了问题也很难去排查到底是哪个线程更新时出了问题; 主线程负责更新,子线程负责耗时操作,能够大大提高响应效率 UI线程非安全线程,多线程进行并发访问有可能会导致内存溢出...ViewRootImp是在onActivityCreated方法后面创建的吗 // ViewRootImp是在onActivityCreated方法后面创建的吗?...一是加锁会让UI访问变得复杂; 二是加锁会降低UI访问效率,会阻塞一些线程访问UI。...为什么还需要开启消息循坏 // 保证上述条件1成立,不就可以避免checkThread时候抛出异常了吗?为什么还需要开启消息循坏?
领取专属 10元无门槛券
手把手带您无忧上云