"对象"就是“基本构造单元”,开发者可以通过对象来存储并传递数据。
在对象之间传递数据并执行任务的过程就叫做"消息传递"。
"属性"在OC中的作用就是封装对象中的数据。OC对象通常会把其所有需要的数据保存为各种实例变量。实例变量一般通过“存取方法”来访问,“获取方法”用于读取变量值,而”设置方法“用于写入变量值。
原子性:在默认情况下,由编译器所合成的方法会通过锁定机制确保其原子性(atomicity)。如果设定属性具备nonatomic特质,则不使用同步锁。
读/写权限:
具备readwrite(读写)特质的属性拥有"获取方法(getter)"与"设置方法(setter)"。若该属性有@synthesize实现,则编译器会自动生成这两个方法。
具备readonly(只读)特质的属性仅拥有获取方法,只要当该属性有@synthesize实现时,编译器才会为其合成获取方法。
内存管理语义:
// 用实例变量完成获取和设置方法
1 typedef NS_ENUM(NSUInteger,EmployeeType){ 2 EmployeeTypeDeveloper, 3 EmployeeTypeDesigner, 4 EmployeeTypeFinance 5 }; 6 7 @interface Employee : NSObject 8 9 @property (copy) NSString *name; 10 @property NSUInteger salary; 11 12 + (Employee *)employeeWithType:(EmployeeType){ 13 switch(type){ 14 case EmployeeTypeDeveloper: 15 return [EmployeeTypeDeveloper new]; 16 break; 17 case EmployeeTypeDesigner: 18 return [EmployeeTypeDesigner new]; 19 break; 20 case EmployeeTypeFinance: 21 return [EmployeeTypeFinance new]; 22 break; 23 24 } 25 } 26 - (void) doADaysWork{ 27 }
每个“实体子类”都是从基类继承而来。
1 @interface EmployeeDeveloper : Employee 2 3 @end 4 5 @implementation EmployeeDeveloper 6 - (void) diADaysWork{ 7 [self writeCode]; 8 } 9 10 @end
基类实现了一个“类方法”,该方法根据待创建的雇员类别分配好对应的雇员实例。这种“工厂模式”是创建类族的办法之一。
3. Cocoa 里的类族
例如 NSArray,NSDictionary,这都是类族。
给某个类族增加子类,需要注意的几条规则:
要点: 1. 类族模式可以把视线细节隐藏在一套简单的公共借口后面;
2. 系统框架中经常使用类族;
3. 从类族的公共抽象基类中继承子类时要当心,若有开发文档,则应首先阅读。
有时需要在对象中存放相关信息,这时我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象。关联对象:可以给某个对象关联许多其他对象,这些对象通过“键”来区分。
1. void objc_setAssociatedObject(id object, void * key,id value,objc_AssociationPolicy policy). 此方法以给定的键和策略为某对象设置关联对象。
2. void objc_getAssociatedObject(id object, void * key). 此方法根据给定的键从某对象中获取相应的关联对象值。
3. void objc_removeAssociatedObject(id object). 此方法移除指定对象的全部关联对象。
用法例子:
1 #import <objc/runtime.h> 2 3 static void *MyAlertViewKey = @"MyAlertViewKey"; 4 5 - (void)askUserAQuestion{ 6 7 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Question" 8 message:@"弄啥呢?" 9 delegate:self 10 cancelButtonTitle:@"Cancel" 11 otherButtonTitles:@"Continue",nil]; 12 13 void (^block)(NSInteger) = ^(NSInteger buttonIndex){ 14 if(buttonIndex == 0){ 15 [self doCancle] 16 } else{ 17 [self doContinue]} 18 }; 19 20 objc_setAssociatedObject(alert,MyAlertViewKey,block,BJC_ASSOCIATION_COPY); 21 [alert show]; 22 23 } 24 25 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 26 void (^block)(NSInteger) = objc_getAssociatedObject(alertView,MyAlertViewKey); 27 block (buttonIndex); 28 }
Effective Objective -C 第二章 对象、消息、运行期(1)
原文:http://www.cnblogs.com/huangF/p/6390223.html