自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(29)
  • 收藏
  • 关注

转载 第29条:理解引用计数

自动引用计数(Automatic Reference Counting, ARC)垃圾收集器:从Mac OS X 10.8开始,“垃圾收集器”(gargae collector)已经正式废弃了。每个对象都有个计数器,用以表示当前有多少个事物想令此对象继续存活下去。叫做“保留计数”(retain count),也可以叫“引用计数”(reference count)。...

2016-08-09 19:02:00 133

转载 第28条:通过协议提供匿名对象

协议定义了一系列的方法。id类型将类的类型隐藏起来了,可以有多个不同的实现类。只在运行期才查出些对象的实际类型可以用协议把API之中的实现细节隐藏起来,将返回的对象设计为遵从此协议的纯id类型(也叫“匿名类型”)。这个概念就称为“匿名对象”(anonymous object)。例:@property(nonatomic, weak) id<EOCDelegate&g...

2016-08-09 19:01:00 104

转载 第27条:使用“class-continuation分类”隐藏实现细节

Objective-C动态消息系统(参见第11条)的工作方式决定了其不可能实现真正的私有方法或私有实例变量。匿名分类的特点:与普通的分类不同,它必须定义在其所接续的那个类的实现文件里。唯一能声明实例变量的分类。而该分类没有特定的实现文件,其中的方法都应该定义在类的主实现文件里。用法:1、向类中新增实例变量。2、在里面声明私有方法。3、隐藏类所遵...

2016-08-09 19:00:00 98

转载 第26条:勿在分类中声明属性

属性是封装数据的方式(参见第6条)。属性只是定义实例变量及相关存取方法所用的“语法糖”,所以也应遵循同实例变量一样的规则。分类机制,应该将其理解为一种手段,目标在于扩展类的功能,而非封装数据。尽管从技术上说,分类里也可以声明属性,但这种做法应该尽量避免。原因是:除了“class-continuation分类”(参见第27条)之外,其他分类都无...

2016-08-09 18:47:00 100

转载 第25条:总是为第三方类的分类名称加前缀

分类机制通常用于向无源码的既有类中新增功能。注意:分类中的方法是直接添加在类里面的,它就好比这个类中的固有方法。将分类方法加入类中这一操作是在运行时系统加载分类时完成的。运行时系统会把分类中所实现的每个方法都加入类的方法列表中。分类中的方法会覆盖原始类中那一份实现代码。如果多个分类多次覆盖,则以最后一个分类为准。通常分类方法覆盖产...

2016-08-09 18:45:00 84

转载 第24条:将类的实现代码分散到便于管理的数个分类之中

“分类”(Category)是Objective-C的一项语言特性。利用分类,无须继承子类即可直接为当前类添加方法。由于Objective-C运行时系统是高度动态的,所以才能支持这一特性。对.m文件进行拆分:类的基本要素(如属性、初始化方法等)都声明在“主实现”(main implementation)里。执行不同类型的操作则归入各个分类中。优点:...

2016-08-09 18:42:00 122

转载 第23条:通过委托与数据源协议进行对象间通信

Objective-C语言特性:协议(protocol),它与Java的“接口”(interface)类似。Objective-C不支持多继承,但可以把类的实现方法定义在协议里面。协议最为常见的用途是实现委托模式(Delegate pattern)。委托模式(Delegate pattern):用来实现对象间的通信,该模式的主旨是:定义一套接口,某对象若想...

2016-08-09 18:41:00 89

转载 第22条:理解NSCopying协议

如果想自定义类支持拷贝操作,那就要实现NSCopying协议(而不是复写copy方法)或NSMutableCopying的协议。不可变版本的拷贝:NSCopying协议,该协议只有一个方法:-(id)copyWithZone:(NSZone*)zone;// 以前开发程序时,会据此把内存分成不同的“区”(zone),而对象会创建在某个区里面。现在不用了,每个程序...

2016-08-09 18:38:00 110

转载 第21条:理解Objective-C错误模型

首先要注意的是:“自动引用计数”(Automatic Reference Counting, ARC,参见第30条)在默认情况下不是“异常安全的”(exception safe)。具体来说,这意味着:如果抛出异常,那么本应在作用域末尾释放的对象现在却不会自动释放了。如果想生成“异常安全”的代码,可以通过设置编译器的标志来实现,不过这将引入一些额外代码,在不抛出异常时,也照样要执行这部...

2016-08-09 18:35:00 65

转载 第20条:为私有方法名加前缀

私有方法名加上某些前缀,1、有助于调试;2、很容易区分公共方法和私有方法(即:容易区分哪些方法容易改动,哪些不易轻易改动。)。Objective-C语言没办法将方法标为私有。每个对象都可以响应任意消息(参见12条),而且可在运行期检视某个对象所能直接响应的消息(参见14条)。根据给定的消息查出其对应的方法,这一工作要在运行期才能完成(参见11条)(Objective...

2016-08-09 18:33:00 98

转载 第19条:使用清晰而协调的命名方式

名称中一般都带有“in”, "for", "with"等介词。骆峰命名法(camel casing)。方法命名:清晰的方法名从左到右读起来好似一段文章。6条规则:1、Boolean 属性应加is前缀。如果某方法返回非属性的Boolean值,那么应该根据其功能,选用has或is当前缀。2、将get 这个前缀留给那些借由“输出参数”来保存返回值的方法。比如,把返...

2016-08-09 18:26:00 76

转载 第18条:尽量使用不可变对象

1、设计类的时候,应充分运用属性来封装数据。2、应该尽量把对外公布出来的属性设为只读,而且只在确有必要时才将属性对外公布。3、若属性仅可于对象内部修改,则在“class-continuation分类”中将其由readonly属性扩展为readwrite属性。这种做法下,如果该属性是nonatomic,那么可能会产生“竞争条件”(race condition, 竞态条件)...

2016-08-09 18:18:00 81

转载 第17条:实现description方法

自定义类需要自己覆写description方法,否则打印信息时就会调用NSObject类所实现的默认方法。(如果不覆写,只会输出类名和对象的内存地址的信息,这只有在判断两个指针是否指向同一对象时才有用处。)debugDescription方法,此方法的用意与description非常相似。区别在于,debugDescription方法是开发者在调用器(debugger)中以控制...

2016-08-09 18:17:00 128

转载 第16条:提供“全能初始化方法”

所有对象均要初始化。可为对象提供必要信息以便其能完成工作的初始化方法叫做“全能初始化方法”(designated initializer, 也常译为:“指定初始化方法”)。初始化方法可以调用全能初始化方法来实现(一个类可以有多个)。于是,只有在全能初始化方法中,才会存储内部数据。这样的话,当底层数据存储机制改变时,只需要修改此方法就好,无须改动其他初始人方法。...

2015-03-27 22:27:00 81

转载 第15条:用前缀避免命名空间冲突

Apple 宣称其保留使用所有“两字母前缀”的权利,所以自己选用的前缀应该是三个字母的。不仅是类名,分类及分类中的方法,第三方库。转载于:https://www.cnblogs.com/Pikdays/p/4371587.html...

2015-03-27 13:44:00 129

转载 第14条:理解“类对象”的用意

对象类型并非在编译期就绑定好了,而是要在运行期查找。id 类型,它能指代任意的 OC 对象类型。编译器假定它能响应所有消息。对象类型 id,由于其本身已经是指针了。在运行期检视对象类型,这一操作也叫做“类型信息查询”(introspection, “内省”),这个特性内置于 Foundation 框架的 NSObject 协议里,凡是由公共根类(即 NSObj...

2015-03-27 12:40:00 79

转载 第13条:用“方法调配技术”调试“黑盒方法”

类的方法映射表,开发者可以向其中新增方法、改变方法的实现、交换方法的指针(在实际应用中,意义不大)。这样我既不需要源代码,也不需要通过继承子类来覆写方法就能改变这个类本身的功能。在运行期,可以向类中新增或替换方法所对应的方法实现,这个操作叫做“方法调配”。开发者常用此技术向原有实现中添加新功能。一般用于调试程序,这种做法不宜滥用。所以在编译器无法确定某...

2015-03-27 12:12:00 66

转载 第12条:理解消息转发机制

在编译期向类发送了其无法解读的消息并不会报错,因为在运行期可以继续向类中添加方法。当对象接收到无法解读的消息后,就会启动“消息转发”机制,程序员可经由此过程告诉对象应该如何处理未知消息。消息转发分两阶段:  1、先征询接收者,所属的类是否能动态添加方法,以处理当前这个未知方法,这叫做“动态方法解析”。  2、完整的消息转发机制。      1、找有没有其他对象...

2015-03-27 10:56:00 100

转载 第11条:理解objc_msgSend的作用

C语言使用“静态绑定”,也就是说,在编译期就能决定运行时所应调用的函数(也就是说函数地址硬编码在指令之中)。如果是内联函数,就无法硬编码在指令之中,而是要在运行期读取出来(也就是动态绑定)。在底层,所有方法都是普通的C函数。OC对象的每个方法都可以视为简单的C函数。<return_type> Class_selector(id self, S...

2014-11-27 19:23:00 102

转载 第10条:在既有类中使用关联对象存放自定义数据

在对象中存放相关信息的方式:1、从对象所属的类中继承一个子类,然后改用这个子类对象。  然而有时类的实例可能是由某种机制所创建的,无法使用这种机制创建自己所写的子类实例。所以采用第2种方式-----“关联对象”2、关联对象  可以给某对象关联多个对象,这个对象用“键”来区分,存储对象值的时,可以指明“存储策略”。存储策略由名为objc_AssociationPoli...

2014-11-27 09:28:00 65

转载 第9条:以“类簇模式”隐藏实现细节

类簇模式把实现细节隐藏在一套简单的公共接口(抽象基类)后面。以保持接口简洁,用户无须自己创建子类实例,只需调用基类方法创建即可。例如:UIButton 的 buttonWithType:工厂模式是创建类簇的办法之一。OC中的系统框架中普通使用此模式。  大部分collection类都是类簇。判断实例所属的类型信息:  isMemberOfC...

2014-11-24 22:14:00 83

转载 第8条:理解“对象等同性”这一概念

1、== 操作符   比较的是两个指针本身,而不是其所指的对象。2、NSObject协议中的isEqual:方法   一般来说两个类型不同的对象总是不相等的。如果已经知道两个对象都属于同一个类,那么就可以使用该方法了。   例:     - (BOOL)isEqual:(id)object {        if (self == object) retur...

2014-11-24 06:14:00 71

转载 第7条:在对象内部尽量直接访问实例变量

直接访问(实例变量),间接访问(属性)。在对象外部:  总是使用属性来访问。在对象内部:  除了几种特殊情况外,强烈建议在读取实例变量时采用直接访问形式。而在设置实例变量时通过属性来做。在初始化方法及dealloc方法中,总是使用直接通过实例变量来读写数据。  例:以下会抛出异常      -(void)setLastName:(NSStrin...

2014-11-24 04:52:00 101

转载 第6条: 理解“属性”这一概念

通过对象来存储并传递数据,在对象之间传递数据并执行任务的过程称为“消息传递”。OC对象会把其所需要的数据保存为实例变量并通过“存取方法”来访问。这称为属性。@dynamic   告诉编译器:不要自动创建实现属性所用的实例变量,也不要为其创建存取方法。这样在编译时虽然发现没有定义存取方法也不会报错,相信在运行期能找到。  例:CoreData 框架中的NSMan...

2014-11-24 04:26:00 86

转载 第5条:用枚举表示状态、选项、状态码

C++11标准扩充了枚举的特性。枚举只是一种常量命名方式。给常量取一个易懂的名字而已。几种定义方式:1、  enum State {    State1,      State2,      State3,    };  enum State aState = State1; //使用2、  enum State {   ...

2014-11-22 01:03:00 176

转载 第4条:多用类型常量,少用#define预处理指令

定义常量的几种方式:  1、#define ANIMATION_DURAION 0.3 //定义了一个动画时长的常量, 预处理过程会把碰到的所有ANIMATION_DURAION一律替换成0.3  2、static const NSTimeInterval kAnimationDuration = 0.3; //static 意味着该变量仅在定义此变量的编译单元...

2014-11-22 00:14:00 62

转载 第3条:多用字面量语法,少用与之等价的方法

名词翻译:  语法糖(syntactic sugar):是指计算机语言中与另外一套语法等效,但是开发者用起来却更加方便的语法。    语法糖可令程序更易读,减少代码出错机率。字面数值  NSNumber *number = @1;字面量数组  NSArray = @[];  @[下标];  //下标访问元素字面量字典  @{key :...

2014-11-21 23:36:00 82

转载 第2条:在类的头文件中尽量少引入其他头文件

@class (向前声明)只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,后面会再告诉你。#import确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。所以,#import比起#include的好处就是不会引起交叉编译。注意:如果在各自头文件中引入对方的头文件,则会导致“循环引用 ”。  虽然#import(而非#inc...

2014-11-21 23:18:00 97

转载 第1条:了解Objective-C 语言的起源

1、OC语言是由Smalltalk演化而来。该语言使用“消息结构” 而 非“函数调用”。使用“消息结构”的语言,其运行时所执行的代码由运行环境来决定;  编译器不需要关心接收消息的对象是什么类型,只在运行时才会去查找所要执行的方法,这也叫动态绑定。而使用“函数调用”的语言,则由编译器决定。2、OC对象是分配在堆(heap)中,不能在栈(stack)中分配OC对...

2014-11-21 23:07:00 83

空空如也

空空如也

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

TA关注的人

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