首页 > 代码库 > 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:方法