标签:
属性的实现
成员变量只能在类内部使用,属性是可以被外界访问的。
#import <Foundation/Foundation.h> @interface QYPerson : NSObject { NSString *_name; } //@property是编译指令,帮助直接生成setter和getter方法,以及成员变量 @property (readonly, nonatomic) NSString *identify; @property (nonatomic) NSString *name; @property (nonatomic) int age; @property (nonatomic, getter=isMan) BOOL sex; // getter=isMan用来更改getter方法的名字,特别对于布尔值的一些属性这样改名字会有利用getter方法语义的理解,尽量不要该setter方法的名字 // @property (nonatomic)int age; // 中间的(nonatomic)是属性扩展,分为三类 // 内存相关的:strong assign copy weak retain // 读写相关的:readonly readwrite(默认值) // 性能相关的:nonaotmic aotmic @end
@dynamic
告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告
然后由自己实现存取方法
@synthesize name = nickName;
@synthesize 在4.2之前版本需要配合生成成员变量名字使用及生成setter getter方法,在4.2之后只是用来给成员变量起别名
a 读写 默认的是readwrite
b 只读 readonly
c 内存管理(默认assign,相当于之前的__unsafe_unretained)
d assign/weak弱引用/strong(retain)(强引用)/copy
对于copy限定的自定义类,是指需要在给该属性赋值的时候用copy来完成,但是这取决于程序员的逻辑
e 原子性(默认nonatomic,可以提高程序性能) nonatmic/aotmic
@private 修饰的成员变量只有本类可见
@protected 修饰的成员变量只有本类和子类中可见
@public修饰成员变量在所有地方都可见
用new新建对象的时候,默认调用的是alloc分配内存,然后再调用init方法初始化
便利初始化:指的是在初始化的时候可以很方便的进行赋值
指定初始化:在编写便利初始化的时候,通过self调用其他属性已编辑好的便利初始化方法并附上初始化的值,即指定初始化值的初始化方法
编写初始化方法的时候一定要记得[super init],用来初始化自超类继承过来的属性变量
类别是对类本身方法方法的扩展
继承是建立一个新的类用来扩展新的属性和方法
将类的实现代码分散到多个不同文件或框架中
拆分头文件
添加非正式协议,非正式协议是指对NSObject的扩展出的类别,所有对象都可以使用非正式协议中声明实现的方法,声明如下
#import <Foundation/Foundation.h> @interface NSObject (BlackRule) - (void)laugh; @end
实现如下
#import "NSObject+BlackRule.h" @implementation NSObject (BlackRule) - (void)laugh { NSLog(@"??,你被潜规则了"); } @end
类别的优先级最高,会掩盖掉原来类中的同名方法,会有警告
使用公共的头文件(可以把类别的声明全部放入发到类的借口文件)
#import <Foundation/Foundation.h> @interface TestClass : NSObject @property (nonatomic, strong) NSString *name; - (void)doTthing; @end // 利用类别来拆分类的实现 @interface TestClass (TestCategory1) - (void)doTthing1; @end @interface TestClass (TestCategory2) - (void)doTthing2; @end @interface TestClass (TestCategory3) - (void)doTthing3; @end
使用分离的头文件(可以按类名+类别名的文件命名方式来单独存放类别的声明),新建category文件来声明实现类别
@selector (方法名)
SEL 可以理解为方法的类型
SEL method = @select(方法名),可以用method作为变量,当做参数使用
//@selector(destoriedLife)代表 SEL method = @selector(destoriedLife); BOOL result = [ps respondsToSelector:method]; if ([ps respondsToSelector:method]) { NSLog(@"执行destoriedLife"); } else { NSLog(@"不能执行destoriedLife"); }
- (BOOL)respondsToSelector:(SEL)aSelector;用来检测对象是否能响应某个方法
协议是建立在两方之上,使用协议之后,必须承诺实现协议声明的所有方法。协议本事是一个有文件,过多的导入头文件会引起编译问题,需要注意协议的使用时机
#import <Foundation/Foundation.h> @protocol SecretProtocol <NSObject> + (void)foo; - (void)phoneCall; - (void)teakTea; @optional //@optional用来修饰协议里面的方法是否可选 - (void)goShopping; @required //@optional用来修饰协议里面的方法是必须实现的 - (void)meetting; - (void)takeDinner; @end
使用协议
#import <Foundation/Foundation.h> #import "SecretProtocol.h" @interface Secrectary : NSObject <SecretProtocol> @end
NSCopying协议
copy:默认调用copyWithZone,copyWithZone:才是NSCopying协议中规定必须实现的
标签:
原文地址:http://www.cnblogs.com/k-on/p/4695465.html