只有继承和协议需要引IMPORT "头文件";

必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值

@property (nonatomic, assign) id<marryprotocol> husband;

避免Optitonal没有实现的功能

if ([_husband respondsToSelector:@selector(driver)]) {

[_husband driver];

}

@required//必须实现的协议, 默认协议

- (void)seeGril;

@optional//可选实现协议

- (void)seeYou;

一个类可以遵守多个协议, 父类后面使用<>

定义类目   类目标    (类目名)

@interface NSString (sayHello)

延展

延展是一种特殊形式的类目

只是把类目的声明移到.m文件中

延展的作用主要就是管理"私有"方法

延展里面可以定义实例变量, 但是是私有的, 不能被子类继承

延展里面可以定义属性

获取当前时间, 但是打印的date是格林尼治时间

NSDate * date = [NSDate date];

用于日期对象NSdate和字符串的相互转换

NSDateFormatter * formattter = [[NSDateFormatter alloc] init];

hh是12时置, HH是24时值  a是上午  G是公元  E是周几

类目

类目(分类, category)只能给已知的类拓展方法, 不能添加实例变量

类目添加的方法会成为原始类的一部分, 级别相同, 会被子类继承

类目里不能定义实例变量

属性就是一对方法, 属性操作实例变量

[p setAge:24];//只要有setter,与下面的方法完全等价

p.name = @"张三";

p.sEx = @"男";

p.age = 24;

点在等号左边,是调用setter方法

点在等号右边,是调用getter方法

没有等号使用点,调用getter方法

果需要更改方法名用(setter = xxx:, getter = ooo);

readonly表示只读特新, 不可以对内容修改, 只有getter没有setter

默认的是生成readwrite,既有setter又有getter

相当于是创建了

- (void)setName:(NSString *)name;

- (NSString *)name;

@property (nonatomic, copy)NSString * sEx;

原子性特性 默认是atomic, 保证多线程情况下访问实例变量的安全性(实质上是在setter方法中增加了线程锁)

非原子性特性, nonatmiic(不保证多线程情况下数据安全)

setter语义特性,assgin, retain, copy

三个区别会导致生成的setter方法的内部实现不一样

assgin就是直接赋值, 而retain和copy会进行内存优化

第一原则:基本数据类型, 必须得用assgin

第二原则:所有的对象类型都可以用retain

第三原则:只接受<NSCoping>协议的对象才能写copy

第四原则:不写默认是assgin

05-02 10:39