编写高质量OC代码52建议总结
文章平均质量分 65
viiimaus
世界是属于勇敢者的,所以世界是属于我的
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
写高质量OC代码52建议总结:51.load和initialize
有时候,类必须先执行某些初始化操作才能正常运行,先说下load方法: +(void)load 加入运行期系统中的每个类及分类必定会调用此方法,只调用一次(在程序启动的时候)。如果类和所属的分类都定义了load方法,先调用类中的,再调用分类中的。 load方法的问题在于,执行的时候系统处在“脆弱时期”,执行子类load之前必定会执行超类load,代码如果依赖了其他类,相关类中的load方原创 2017-07-28 16:18:04 · 547 阅读 · 0 评论 -
写高质量OC代码52建议总结:37.理解“块”
块和函数类似,只是直接定义在另一个函数里,和定义它的函数共享同一个范围里的东西。用“^”来表示。 ^{ //block }; 块和int,float或其他对象一样,可以作为一个值赋给变量并使用。块类型的语法和函数指针类似。 void (^someBlock)() = ^{ //block }; 块类型的语法结构: return_type (^block_name)(原创 2017-06-28 13:03:27 · 397 阅读 · 0 评论 -
写高质量OC代码52建议总结:36.不要使用retainCount
OC通过引用计数来管理内存。其值表明还有多少个对象希望此对象继续存活。对象创建后,其保留计数大于0.保留与释放操作会使该计数递增和递减,当引用计数变为0时,系统回收对象。 ARC中已经将此方法废弃。 1.它所返回的引用计数只是某个时间点上的值。该方法并没有考虑到稍后系统会把自动释放池清空,因而不会将后续的释放操作计算到数值里。这样,就未必能反映真实的计数了。 2.retainCount原创 2017-06-27 13:37:17 · 432 阅读 · 0 评论 -
写高质量OC代码52建议总结:35.用僵尸对象调试内存管理问题
向已回收的对象发送消息是不安全的。具体是否可行看具体情况,取决于对象所占用的内存是否被其他内容覆写。但这无法确认。在程序没有崩溃的情况下,那块内存可能只复用了其中一部分,对象中的某些二进制数据依然有效。还有一种可能,就是那块内存恰好被另外一个有效且存活的对象所占据。在这种情况下,运行期系统会把消息发送到新对象那里,如果新对象无法响应方法,程序依然会崩溃。Cocoa提供了“僵尸对象”,启原创 2017-06-27 11:36:41 · 562 阅读 · 0 评论 -
写高质量OC代码52建议总结:40.用块引用其所属对象不要出现保留环
#import typedef void(^EOCNetworkFetcherCompletionHandler)(NSData *data);@interface EOCNetworkFetcherTwo : NSObject@property (nonatomic, strong, readonly) NSURL *url;-(id)initWithURL:(NSURL *)ur原创 2017-07-14 18:05:00 · 520 阅读 · 0 评论 -
写高质量OC代码52建议总结:39.用handler块降低代码分散程度
iOS系统上有个“系统监控器”,如果程序在一定时间内无响应,就会被自动终止。所以,在处理用户界面的显示及触摸操作所用的线程(主线程)不能因为要执行I/O或者网络通信这类耗时的任务而阻塞。异步方法在执行完任务后,需要以某种手段通知相关代码。常用的手段是设计委托代理。当相关事件发生时就可以通知对象执行相关操作了。#import @class EOCNetworkFercher;@prot原创 2017-07-12 14:36:05 · 479 阅读 · 0 评论 -
写高质量OC代码52建议总结:38.为常用的块创建typedef
例: ^(Bool yesOrNo, int index){ if yesOrNo { return index * 2; } else { return index * 3; } } 如果将block赋值给变量: int (^hahaBlock)(Bool yesOrNo, int index) = ^(Bool ye原创 2017-07-11 08:57:48 · 328 阅读 · 0 评论 -
写高质量OC代码52建议总结:33.以弱引用避免保留环
几个对象都以某种方式互相引用,从而形成保留环。由于OC内存管理模型使用引用计数架构,所以这种情况通常会导致内存泄漏,因为最后没有别的对象会引用环中的对象。环里的对象将永久存活,不会被系统回收。避免保留环的最佳方式就是弱引用,即“非拥有关系”。OC中有一项与ARC相伴的运行期特征,可以令开发者安全的使用弱引用,weak,它和unsafe_unretained的作用完全相同。只要系统把属性回收,属原创 2017-05-04 08:55:08 · 435 阅读 · 0 评论 -
写高质量OC代码52建议总结:32.编写“异常安全代码”时留意内存管理问题
纯C没有异常,而C++和OC都支持异常。当前运行期系统中,C++与OC的异常相互兼容。 异常只应在发生严重错误后抛出,虽说如此,有时仍然需要编写代码来捕获并处理异常。比如使用OC编码时,或者编码中用到了第三方程序库而此程序库所抛出的异常又不受你控制时,就需要捕获及处理异常了。 在try块中,如果先保留了某个对象,然后在释放它之前抛出了异常,除非catch快能处理此问题,否则对象做占用的内存原创 2017-05-03 17:19:08 · 639 阅读 · 0 评论 -
写高质量OC代码52建议总结:52.NSTimer会保留其目标对象
计时器需要和“运行循环”相关联,如下: + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; 用这个方法创建计时器,会在指定时原创 2017-07-30 20:51:30 · 415 阅读 · 0 评论 -
写高质量OC代码52建议总结:41.多用派发列队,少用同步锁
如果有多个线程要执行同一份代码,有时会出问题。对数据的读写时机不可控。通常要使用锁机制来实现同步。有两种办法。 -(void)synchronizedMethod { @synchronized(self) { // safe } } 这种方式会根据给定的对象,自动创建一个锁,等块中的代码执行完成,锁就释放。例子中的对象都是self,这样可以保证每个self原创 2017-07-24 17:48:28 · 784 阅读 · 0 评论 -
写高质量OC代码52建议总结:42.多用GCD,少用performSelector系列方法
有几个方法可以推迟执行方法调用,也可以指定运行方法。这些功能原来很有用,但是现在有个大中枢派发和块则应该避开。 -(id)performSelectoer:(SEL)selector 下面两行代码执行效果相同: [object performSelector:@selector(selectorName)]; [object selectorName]; 看上去这个方法有点多余,如果原创 2017-07-25 13:20:50 · 427 阅读 · 0 评论 -
写高质量OC代码52建议总结:50.构建缓存时选用NSCache而非NSDictionary
NSCache胜过NSDictionary之处在于,当系统资源耗尽时,他可以自动删减缓存,用字典就得自己写挂钩,系统低内存时手工删减,十分复杂。 NSCache不会“拷贝”键而是“保留”,这个点字典也能实现但是很复杂(49条~)。很多时候键都是由不支持拷贝的对象充当的,这点用起来比字典方便。NSCache是线程安全的,多个线程可以同时访问NSCache。 可以控制缓存删减的实际,有两个参数原创 2017-07-28 14:39:10 · 1010 阅读 · 0 评论 -
写高质量OC代码52建议总结:49.对自定义其内存管理语义的collection使用无缝桥接
OC系统库包含相当多的collection类,其中各种数组、字典、set。CoreFoundation框架也定义了一套C语言的API,操作这些collection及数据结构。Foundation中的NSArray和CoreFoundation中的CFArray是等价的。两种创建数组的方式可能有区别,“无缝桥接”技术可以在两个类型之间转换。 CFArray要通过CFArrayRef来引用,而这是原创 2017-07-28 11:46:59 · 520 阅读 · 0 评论 -
写高质量OC代码52建议总结:48.多用块枚举,少用for循环
以下是for循环针对NSArray,NSSet,NSDictionary的遍历。字典和set都是无序的,无法根据特定的整数下标直接访问其值。遍历set和dictionary都需要而外创建数组储存对象和key。这个中介数组增加了不必要的而外开支。-(void)demoforArray{ NSArray *anArray = /***/; for (int i = 0; i < a原创 2017-07-27 17:09:37 · 713 阅读 · 0 评论 -
写高质量OC代码52建议总结:47.熟悉系统架构
将一系列代码封装为动态库,并放入描述接口的头文件,这种东西叫做框架。为iOS平台开发的第三方框架所使用的是静态库(static library),因为iOS应用程序不允许在其中包含动态库。 Cocoa Touch 里面继承了一批创建应用程序时经常用到的框架。 Foundation框架,NSObject, NSArray, NSDictionary等类都在其中。还提供了字符串处理的功能,NS原创 2017-07-27 11:47:46 · 558 阅读 · 0 评论 -
写高质量OC代码52建议总结:46.不要使用dispatch_get_current_queue
使用GCD的时候经常要判断当前代码是在哪个队列上执行的,会发现有下面这个函数: dispatch_queue_t dispatch_get_current_queue(); iOS 6.0开始已经弃用这个函数了,它检测当前队列是不是某个特定的队列。-(NSString *)someString { __block NSString *localSomeString; d原创 2017-07-27 10:01:49 · 2869 阅读 · 0 评论 -
写高质量OC代码52建议总结:45.使用dispatch_once来执行只需要运行一次的线程安全代码
单例模式,该方法只会返回全类共用的单例实例,不会每次调用都创建新的实例。@implementation EOCClass +(id)sharedInstance { static EOCClass *sharedInstance = nil; @synchronized(self) { if (!sharedInstance) { sh原创 2017-07-26 11:11:46 · 760 阅读 · 0 评论 -
写高质量OC代码52建议总结:44.通过Dispatch Group机制,根据系统资源状况来执行任务
dispatch group能够把任务分组。等待这组任务执行完毕,在回调函数中继续往下执行。比如,可以把压缩一系列文件的任务表示成dispatch group: dispatch_group_tdispatch_group_create(); 有两种方法给任务编组。 void dispatch_group_async(dispatch_group_t group, dispatch_que原创 2017-07-25 17:19:11 · 520 阅读 · 0 评论 -
写高质量OC代码52建议总结:43.掌握GCD及操作队列的使用时机
执行后台任务时,GCD并不一定是最佳方式。NSOperationQueue,可以把操作以NSOperation子类的方式放在队列中,也能够并发执行。从iOS 4和Mac OSX 10.6开始,操作队列是在底层用GCD来实现的。 差别:GCD是纯C的API,操作队列是OC的对象。GCD任务用块表示,操作队列是更为重量级的OC对象。但是GCD并不总是最佳方案,有时采用对象所带来的开销微乎其微。原创 2017-07-25 14:59:49 · 471 阅读 · 0 评论 -
写高质量OC代码52建议总结:31.在dealloc方法中只释放引用并解除监听
对象在经历其生命周期之后最终会被系统回收,这时需要执行dealloc方法。在每个对象的生命周期内,此方法在保留计数降为0时只执行一次。绝不该自己调用dealloc方法,系统会在运行期适当的时候调用它。一旦调用了dealloc方法后,对象就不再有效了。 在dealloc方法中,ARC会自动生成.cxx_destruct方法并自动添加。对象所拥有的其他非OC对象也要释放,比如CoreFoundat原创 2017-05-03 13:09:15 · 2246 阅读 · 0 评论 -
写高质量OC代码52建议总结:34.以“自动释放池块”降低内存峰值
释放对象的方式有两种,一种是使用release,另一种是调用autorelease,将其加入自动释放池。自动释放池用于存放那些需要在稍后某个时刻释放的对象。清空自动释放池时,系统会向池中的对象发送release消息。 如果在没有创建自动释放池的情况下给对象发送release消息,控制台会输出警告消息。一般情况下不需要担心自动释放池的问题。系统会自动创建一些线程,这些线程默认都有自动释放池,每次原创 2017-05-11 09:16:17 · 416 阅读 · 0 评论 -
写高质量OC代码52建议总结:30.以ARC简化引用计数
if ([self shouldLogMessage]) { NSString *message = [[NSString alloc] initWithFormat:@"I am object, %p", self]; NSLog(@"message = %@", message); } 这段代码采用手动管理内存的方式,存在内存泄露的问题。if语句块末尾并没有释放message原创 2017-04-28 09:47:29 · 3692 阅读 · 0 评论 -
编写高质量OC代码52建议总结:25.总是为第三方类的分类名称加前缀
分类中的方法是直接添加在类里面的,他们就好比这个类中的固有方法。将分类方法加入类的方法列表中,如果类本身就由此方法,分类又实现了一次,那么分类中的方法会覆盖原来那一份实现代码。实际上可能会覆盖很多次,例如,某个分类中的方法覆盖了“主实现”中的相关方法,而另外一个分类中的方法有覆盖了这个分类中的方法。多次覆盖的结果以最后一个分类为准。程序运行时,由于执行结果和预期的不同,所以自己写的那些代码不会执行原创 2017-03-01 08:58:49 · 1377 阅读 · 0 评论 -
编写高质量OC代码52建议总结:24.将类的实现代码分散到便于管理的数个分类中
类中经常会被填满各种方法,这些方法经常会被堆在一个实现文件里。这种情况下可以通过OC中的“分类机制”,把类按逻辑划入几个分区中。/* NSURLRequest.h Copyright (c) 2003-2016, Apple Inc. All rights reserved. Public header file.*/#import #imp原创 2017-02-28 13:44:55 · 1381 阅读 · 0 评论 -
编写高质量OC代码52建议总结:11.理解objc_msgSend的作用(消息机制)
在对象上调用方法,术语叫做“传递消息”,消息有“名称”和“选择器(方法)”,可以接收参数,还可能有返回值。OC是C的超集,C语言使用静态绑定,在编译期间就能决定运行时做调用的函数。#include void printHello() { printf("hello, world!\n");}void printGoodbye() { printf("Goodbye,原创 2017-02-09 19:34:42 · 9728 阅读 · 0 评论 -
编写高质量OC代码52建议总结:18.尽量使用不可变对象
一般情况下,我们需要建模的数据未必需要改变。具体到编程实践中,应该尽量吧对外公布出来的属性设为只读,而且只在有必要的时候才对外公布。如果试着改变属性值,编译器就会报错。对象中的属性值可以读取,但是不会写入。开发者在使用对象时就能确定其底层数据不会改变。 即使属性为只读(没有setter方法),也应该设置内存管理语义,如果以后想修改为读写属性,就会简单一些。 在对象外部仍可以通过“键值编码”原创 2017-02-17 14:16:55 · 999 阅读 · 0 评论 -
编写高质量OC代码52建议总结:10.关联对象
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key) OBJC_EXPORT voi原创 2017-02-08 19:39:57 · 607 阅读 · 0 评论 -
编写高质量OC代码52建议总结:1~8
#pragma mark -- 1.了解OC的起源 /* 不说了。。。。 */#pragma mark -- 2.在类的头文件中尽量少引用其他类的头文件 /* 1.在编译一个类文件时,不需要知道类的全部细节,编译时,会引入很多用不到的细节,增加编译时间 2.除非有必要,请在.m文件中引入其他类的头文件,可以降低类之间的耦合 */#pragma mark -- 3.多原创 2017-02-07 14:40:47 · 2426 阅读 · 0 评论 -
编写高质量OC代码52建议总结:9.以“族类模式“隐藏实现细节
以 UIButton为例 + (instancetype)buttonWithType:(UIButtonType)buttonType;类方法创建button,其类型取决于传入的按钮类型。 按钮类型 typedef NS_ENUM(NSInteger, UIButtonType) { UIButtonTypeCustom = 0,原创 2017-02-08 19:45:13 · 569 阅读 · 0 评论 -
编写高质量OC代码52建议总结:17.实现describtion方法
1.实现describtion方法返回一个有意义的字符串2.在调试中打印出详细的信息,实现debugDescription方法原创 2017-02-16 18:20:40 · 876 阅读 · 0 评论 -
编写高质量OC代码52建议总结:19.使用清晰而协调的命名方式
类、方法及变量的命名是Objective-C编程的重要环节。通常会觉得OC的语言很繁琐,因为其语法结构使代码读起来和句子一样。 [@"asdasdas" stringByReplacingOccurrencesOfString:@"a" withString:@"b"]; 此段代码看起来比较繁琐,但是准确的表达了开发者想做的事 方法与变量名使用了“驼峰命名”,以小写字原创 2017-02-20 16:16:12 · 1876 阅读 · 0 评论 -
编写高质量OC代码52建议总结:20.为私有方法加前缀
应该为私有方法的名称加上某种前缀,这样方便调试,也有助于把公有方法和私有方法区别开。 OC没办法把方法设置为私有的,每个对象都可以响应任意消息,而为可以在运行期检视某个对象所能直接相应的消息,根据给定的消息查出对应的方法,开发者只有在命名上体现私有方法。 总结: 1.给私有方法的名称加上前缀,可以区分公有方法和私有方法。 2.不要单用一个下划线作为私有方法的前缀。原创 2017-02-20 16:36:35 · 1279 阅读 · 0 评论 -
编写高质量OC代码52建议总结:26.不要在分类中设置属性
除了"class-continuation"分类之外,其他分类都无法向类中新增实例变量。因此,无法合成实现属性所需的实例变量。 例如:专门设计一个处理交友事物的类,其中所有的方法都与操作朋友列表有关。#import "LYKPerson.h"@interface LYKPerson ()@property (nonatomic, copy, readonly) NSString *原创 2017-03-01 16:15:02 · 886 阅读 · 0 评论 -
写高质量OC代码52建议总结:29.理解引用计数
c使用引用计数来管理内存,可加减。想让某个对象继续存活,就增加其引用计数,用完了就递减。引用计数为0时,表示没人继续使用该对象,就可以销毁了。 “垃圾回收机制”在MAC OS X 10.8之后废弃,在IOS上从未支持过“垃圾回收机制” Retain 递增保留计数 release 递减保留计数 autorelease 稍后清理“自动释放池”时,再递减保留计数原创 2017-03-29 14:43:02 · 670 阅读 · 0 评论 -
编写高质量OC代码52建议总结:23.通过委托与数据源协议进行对象间通信
委托模式:定义一套接口,某对象如果想接受另一个对象的委托,需要遵循此接口,成为其“委托对象”。 例如:要编写一个从网站获取数据的类,此类也许要从远程服务器的某个资源里获取数据。那个远程服务器可能很久之后才会有反应。这种情况下,我们可以使用委托模式。获取网络数据的类中含有一个“委托对象”,获取完数据后,它会回调这个委托对象。EOCDataModel对象就是EOCNetworkFetcher的委托原创 2017-02-27 11:51:04 · 1133 阅读 · 0 评论 -
写高质量OC代码52建议总结:28.通过协议提供匿名对象
协议定义了一系列方法,遵从协议的对象应该实现它们。我们可以用协议把自己写的API隐藏自来,将返回的对象设计为遵从协议的id类型。想要隐藏的类名就不会出现在API中了。如果接口背后有多个不同的实现类,而你又不想指明具体使用哪个类,可以考虑用这个办法,因为有时候这些类可能会变。 @property (nonatomic, weak) iddelegate; 由于该属性是id,所以任何类的对象都原创 2017-03-03 14:31:41 · 945 阅读 · 0 评论 -
编写高质量OC代码52建议总结:22.理解NSCopying协议
如果想令自己的类支持拷贝操纵,就要实现NSCopying协议 -(id)copyWithZone:(NSZone *)zone{ return nil; } NSZone:以前开发程序时,会把内存分为不同的区,对象会创建在某个区里。现在不用,每个程序都会有一个默认区,这个参数不用管。。。 copy方法由NSObject实现,当我们想要覆写copy方法是,实际需要实原创 2017-02-24 11:52:53 · 1006 阅读 · 0 评论 -
编写高质量OC代码52建议总结:27.使用“class-continuation 分类” 隐藏实现细节
类中经常会包含一些无需对外公布的方法及实例变量。OC的动态消息系统的工作方式决定了其不可能实现真正的私有。但是,我们还是应该尽量只把需要对外公布的那部分公开。 “class-continuation 分类” 和普通的分类不同,它必须定义在主类的实现文件里。这是唯一能声明实例变量的分类,此分类没有特定的实现文件,其中的方法都应该在类的主文件里实现。 公共接口可以定义实例变量。把他们定义在“c原创 2017-03-02 16:44:22 · 1288 阅读 · 0 评论 -
编写高质量OC代码52建议总结:13.用“方法调配技术”调试“黑盒方法”
1.在运行期,可以向类中新增和替换所对应的方法实现。2.使用另一份实现来替换现有的方法实现,“方法调配”,常用于向原有实现中添加新功能。3.一般情况,只有调试程序的时候才使用此方法。原创 2017-02-14 13:39:47 · 903 阅读 · 0 评论
分享