首页 > 代码库 > OC总结
OC总结
1.类和对象
面向过程编程(Procedure oriented Programming, POP):以事件为中心,关心完成该事件的详细步骤,一步一步如何实现
面向对象编程(Object Oriented Programming, OOP):以事物为中心,也就是参数事件的参与者,设计事物的功能,而完成事物只是事物的所有功能中的一个小功能
类:具有相同特征 和 相同行为的 事物的抽象
类是一个抽象的概念,在生活不具体
描述一个类:通过 特征(静态属性) 以及 行为(动态属性,动作)
对象:是类的实例,也就是类的具体表现,视具体的,生活中的万物都是对象
OC中方法的调用,采用消息发送机制
[receiver message] receiver :消息的接受者,类或者对象 message :消息也就是OC的方法
类的定义分为两部分:
(1)类的接口部分:提供外部访问的借口,相当于使用说明书,写在.h文件中.
a.以 @interface 开头,以 @end 结束,只有把类的接口定义内容写在开始和结束之间才有效
b.实例变量必须写在大括号之内,而且大括号只能写在实例变量
(2)类的实现部分:相当于功能的实现,写在.m文件中.
a.@implementation 开头 @end 结束,实现内容必须写在中间才有效
b.@implementation 后的 Person 是要实现的类(需要指定要对哪一个类做实现)
.m.h文件和类没有直接关系,文件中可以存放多个类,要类符合接口部分以及实现部分的定义格式就可以了
一般情况下,一个文件就定义一个类,而且文件的名字和类的名字一样,这样就能清晰的知道该文件中的类的名字
2.自定义初始化,setter方法,getter方法,实例变量的可见度
实例变量的可见度:
(1) @public:公共的,在任何文件中都可以访问
(2)@protected:受保护的,有一定的访问权限,只允许在本类文件以及子类文件中访问,其他文件不可以访问
(3)@private:私有的,只允许在本类文件中访问,不可以在子类文件 以及其他文件中访问
系统默认的可见度是@protected
自定义初始化
- (id)initWithBrand:(NSString *)brand; - (id)initWithBrand:(NSString *)brand { _brand = brand; return self; }
setter方法
- (void)setBrand:(NSString *)brand; - (void)setBrand:(NSString *)brand { _brand = brand; }
getter方法
- (NSString *)brand; - (NSString *)brand { return _brand; }
3.NSString和NSMutableString
(1)创建对象
a.便利构造器(+号方法)
NSString *str1 = [NSString stringWithFormat:@"iPhone%d", 5];
b.alloc+初始化方法
NSString *str2 = [[NSString alloc] initWithFormat:@"iPhone%d", 4];
length方法 求字符串长度
NSUInteger length = [str1 length];
characterAtIndex:方法 获取字符串中的某个字符
判断是否以指定的字符串开头(hasPrefix:方法),或者以指定的字符串结尾(hasSuffix:)
rangeOfString:方法 查找指定字符串的范围
字符串截取(获取子字符串) substringFromIndex:方法 和 substringToIndex:方法
获取指定范围内的字符串 substringWithRange:方法
字符串拼接 stringByAppendingString:方法
替换字符串 stringByReplacingOccurrencesOfString:方法 和stringByReplacingCharactersInRange:withString:方法
字符串比较 compare:方法
字符串大小写 uppercaseString方法 lowercaseString方法 capitalizedString方法
appendFormat:方法 deleteCharactersInRange:方法 insertString:atIndex:方法 replaceCharactersInRange:withString:方法
4.NSArray和NSMutableArray
arrayWithObjects:方法
count方法
objectAtIndex:方法
firstObject方法
lastObject方法
indexOfObject:方法
containsObject:方法
sortedArrayUsingSelector:方法
NSArray *sortArr = [arr2 sortedArrayUsingSelector:@selector(compare:)];
forin快速枚举
for (NSString *str in arr2) { NSLog(@"%@", str); }
addObject:方法
removeObjectAtIndex:方法
removeAllObjects方法
replaceObjectAtIndex:withObject:方法
exchangeObjectAtIndex:withObjectAtIndex:方法
sortUsingSelector:方法
[arr1 sortUsingSelector:@selector(compare:)];
重写从父类继承的方法description
当打印该类的对象时,系统会自动调用该方法
- (NSString *)description { //%g可以负略掉无用的零0 return [NSString stringWithFormat:@"name:%@ price:%g", _name, _price]; }
5.NSDictionary和NSMutableDictionary
dictionaryWithObjectsAndKeys:nil方法 initWithObjectsAndKeys:nil方法 创建对象
allKeys方法 获所有的key
objectForKey:方法 根据key获取对应的value
removeObjectForKey:方法 删除元素
setObject:forKey:方法 添加元素或修改key对应的value
先根据指定的key查找字典中是否存在相同的key,(查找字典中的是否存在指定的key) 如果存在,则修改key对应的value,如果不存在,在字典中添加一个元素,key-value键值对
5.NSSet和 NSMutableSet
anyObject方法 获取集合中的某个元素
containsObject:方法 判断集合中是否包含某个对象
setWithObjects:nil方法 设置集合
removeObject:方法 移除元素
6.block
int (^block)(int x, int y) = ^(int x, int y) { return x + y; }; 当把函数的实现赋给block变量之后,block变量就可以当做函数名使用
当在block内部使用block外部定义的(局部变量)时,如果 变量没有被__block修饰, 则在block内部是readonly(只读的),不能对它修改,如果想修改,变量前必须要有__block修饰
__block的作用告诉编译器,编译时在block内部不要把外部变量当做常量使用,还是当做变量使用
如果在block中访问全局变量,就不需要__block修饰
7.属性和点语法
用来替代setter以及getter方法,使用属性可以快速创建setter以及getter方法的声明,setter以及getter方法的实现,另外还添加了对实例变量操作的安全处理
@property只是自动声明setter以及getter方法的声明
@synthesize 属性的实现部分,实现属性自动生成的setter以及getter方法
如果将@synthesize省略,并且我们自己实现setter以及getter方法时,系统不会生成对应setter以及getter,还有实例变量
属性的特性
第一大特性:读写特性
(1)readonly:告诉编译器,属性在自动生成方法时,只会生成getter方法,不会生成setter方法
(2)readwrite:告诉编译器,属性在自动生成方法时,即要生成setter方法,也要生成getter方法,系统默认的读写特写
(3)setter = aa: 告诉编译器,当自动生成setter方法时,setter方法的方法名为指定的名字aa:,不采用默认的
(4)getter = bb 告诉编译器,当自动生成getter方法时,getter方法的名字为指定的名字bb,不采用默认的
第二大特性:原子性特性
(1)atomic:原子特性,保证线程安全,内部做了安全处理(加锁与解锁),系统默认的原子特性
(2)nonatomic:非原子特性,不保证线程安全,因为对于setter以及getter方法的使用,比较频繁,在一段时间内可能要多次访问,所以使用atomic会非常消耗系统的资源,降低程序的执行效率,使用nonatomic虽然不保证线程安全,但是使用一般情况下都是安全的,所以对于原子特性,使用nonatomic
第三大特性:语义特性
(1)assign : 直接赋值,使用针对于基本数据类型,也可针对于对象类型,系统默认的语义特性
(2)copy : 针对于对象类型,并且要服从NSCopying协议的对象才可以 会复制出一个新的对象,拥有新的对象的所有权,(引用计数+1) (先暂时这么理解)
(3)retain : 针对于对象类型,会造成对象的引用计数+1,
点语法,是一种快速访问setter以及getter方法的方式,声明属性默认生成对应的setter以及getter方法,所以属性和setter和getter方法都关联
对象.属性名 ---如果在等号的左边,意味着调用setter方法,除此情况,都是调用getter方法
8.NSDate和NSDateFormatter
date方法 获取当前时间
dateWithTimeIntervalSinceNow:方法
timeIntervalSinceDate:方法
earlierDate:yesterdayDate方法 获得两个日期中较早的日期
laterDate:yesterdayDate方法 获得两个日期中较晚的日期
compare:方法 两个日期比较
setDateFormat:方法
setDateStyle:方法
stringFromDate:方法
9.分类 协议 延展
分类,类目,category
目的 是为没有源代码的类添加方法,(只能添加方法,不能添加实例变量)
是扩充一个类的功能方式之一,为原有类扩充得方法会成为原类得一部分,使用即可
分类也分为.h(接口部分) 以及.m(实现部分)
协议 相当于一个任务清单,规定了要做的操作(只有一系列方法得声明), 谁服从该协议,谁就要实现该协议中的方法.(完成任务清单)所以协议只有.h文件,没有.m文件
<> 表示服从协议,服从的协议写在<>之内
代理的语义特性为assign
@optional 可选的, 被他修饰的方法服从协议的类可以选择实现(可以实现,也可以不实现)
@required 必须的, 被他修饰的方法服从协议的类必须选择实现(没有商量的余地)
延展 也是扩充类得的功能的一种方式,只不过延展扩充的内容是私有的,是在.m文件中定义的
延展即可以扩展方法也可以扩展实例变量,只不过都是私有的,外界无法直接访问
延展是为有源代码的类扩充内容 (Extension)
10.内存管理
内存管理基本原则:
如果你对一个对象进行alloc retain copy之后,你就拥有了该对象的所有权,你就必须对它进行release或者autorelease
内存问题:野指针异常 内存泄露
autorelease 会将声明为autorelease的对象放入离他最近的自动释放池中,当自动释放池销毁时,回向池中的每一个对象发送一个release消息
当该类的对象引用计数为0时,系统会自动调用该类的dealloc方法来回收空间,该方法是由系统自动调用,不能手动调用
验证对象空间有没有回收,只要查看该类的dealloc方法有没有执行即可
属性的内存管理
//setter getter 方法,内部是对实例变量赋值以及实例变量的屈指操作,所以方法内要操作实例变量 - (void)setTea:(Teacher *)tea { //判断原有对象和新对象是否是同一个,如果是同一个,就没有必要再重新赋值,否则 会先release, release之后空间被系统回收,此时再retain就成野指针问题了 if (_tea != tea) { [_tea release]; //释放保有的之前对象的所有权 //让实例变量保有新的对象的所有权 _tea = [tea retain]; } } //语义特性为copy,setter方法内部实现 - (void)setTea1:(Teacher *)tea1 { if (_tea1 != tea1) { [_tea1 release]; //如果相对一个对象进行copy操作,对象的类必须服从一个NSCopying协议,并且实现协议中的方法 _tea1 = [tea1 copy]; } } - (void)dealloc { //当该类对象的引用计数为0时,会自动调用该类的dealloc方法 //当调用dealloc方法时,该对象的空间将要被系统回收,在空间回收之前,将保有的其他对象的所有权释放掉 [_tea release]; [_tea1 release]; [super dealloc]; }
便利构造器的内存管理
+ (id)teacherWithName:(NSString *)name Gender:(NSString *)gender { Teacher *teacher = [[Teacher alloc] initWithName:name Gender:gender]; return [teacher autorelease]; }
collocation 的内存管理
当把一个对象放在一个集合(数组,字典,集合)中时,会将对象的引用计数 +1,因为内部做了retain操作
当collocation(数组,字典,集合) 空间被回收时,他们会向容器中的每一个元素都发送一个release消息(对应添加元素时的retain操作)
当从collocation(数组,字典,集合)中移除一个元素时,会release该对象,引用计数-1
11.KVC
KVC : key-value-coding 键值编码 是一种间接访问实例变量的方式,通过指定的key来找到对应的实例变量(切记:key是字符串)
KVC的工作原理:根据指定的key,比如:name
(1)先查找该类是否有对应setter方法:比如setName:如果有,则通过setter方法给实例变量赋值,如果没有,则转到(2)
(2)查找该类有没有一个_+key的实例变量,比如_name,如果有,则给_name赋值,如果没有则转到(3)
(3)查找该类是否具有一个和key同名的实例变量,比如name,如果有,则给name赋值,如果没有,则转到(4)
(4)如果都没有找到,系统会抛出一个NSUnknownKeyException,说明没有找到可匹配的key,(也就是该类既没有setName:,也没有_name,也没有name)
setValue:forKey:方法
setValue:forKeyPath:方法
setValuesForKeysWithDictionary:方法