OC总结
来源:互联网 发布:一键救砖刷机软件 编辑:程序博客网 时间:2024/05/19 23:15
一. OC类和对象
1.面向过程编程(Procedure Oriented Programming,POP):以事件为中心,关心完成该事件的详细步骤,一步一步如何实现.
面向对象编程(Object Oriented Programming, OOP):以事物为中心,也就是参数事件的参与者,设计事物的功能,而完成事件只是事物的所有功能中的一个小功能.
2.类:具有相同特征 和相同行为的 事物的抽象.
类是一个抽象的概念,在生活中不具体.
对象:是类的实例,也就是类的具体表现,是具体的,生活中的万物都是对象.
描述一个类? 通过 特征(静态属性)以及 行为(动态属性,动作).
3.面向对象三大特性:
封装:(Encapsulation) 多态:(Polymorphism) 继承:(Inheritance)
4.@ OC的标志
5. 消息发送机制:
[receivermessage]
receiver:接收者, 类或者对象
message:方法
-->对象
+->类
二.OC中的方法
1.实例变量的可见度:一共有三种
@public:公共的,在任何文件中都可以访问.(访问方式是通过对象+指向操作符+实例变量,例如:per->name)
@protected:受保护的,有一定的访问权限,只允许再本类文件以及子类文件中访问,其他文件不可以访问.
@private:私有的,只允许再本类文件中访问,不可以在子类文件 以及其他文件中访问.
默认的可见度是@protected.
2.为什么不声明为@public?
(1).声明为@public的实例变量,外部就可以访问以及修改,会影响内部的一个实现,暴露实现细节.
(2).违背了OC面向对象三大特性之一---封装.(封装的思想是隐藏内部实现,提供外部访问的接口)
3.为什么不声明为@private?
(1).声明为@private的实例变量,子类文件访问不到,所以子类文件还需重新定义声明.
(2).违背了OC面向对象特性之一---继承.(父类有的东西,子类也有,可访问)
4.文件和类没有关系.文件中可以存放多个类,只要类符合接口部分以及实现部分的定义格式就可以了.
一般情况下,一个文件中就定义一个类,而且文件的名字和类的名字一样,这样就能清晰的知道该文件中的类的名字.
在+号方法中不能使用实例变量,实例变量是以依托与对象存在的,只有有了对象,实例变量才会有空间.
三.OC之继承,初始化方法
1.继承:当多个类出现部分相同的实例变量和方法时,就要考虑用继承.
2.继承的使用:将多个类中相同的实例变量的方法提出来写成一个公共的父类.
3.继承的上层:父类 继承的下层:子类
继承是单向的,不能相互继承.
继承具有传递性:A继承于B, B继承于C, A具有B和C的特征和行为.
子类可直接拥有父类中除了声明为@pivate的实例变量之外的全部内容.
4.植物大战僵尸:普通僵尸,路障僵尸,铁桶僵尸.
共同点:存在部分相同的特征和行为
5.面向对象提供了继承语法,能大大简化代码.把公共的方法和实例变量写在父类里,子类只需要写自己独有的实例变量和方法即可.
6.继承既能保证类的完整,又能简化代码.
7.子类继承父类:会将父类中除了声明为@private的实例变量以及私有方法(在.h文件中没有声明,但在.m文件中实现)之外,其余内容都会被继承,所以如果子类中有和父类同样的内容,可以全部删除.
私有方法:在.m文件中实现,但是没有在.h文件中声明的方法,叫做私有方法,私有方法不允许在外部访问,但是可以再本类中访问.
8.OC中只允许单继承.
被继承的类为父类(super class), 也称为超类,
继承的类称为子类(sub class).
9.继承时的方法会存在三中情况:
(1).保留父类对该方法的实现,(实现方式,不重写方法)
(2).按子类重写之后的方式来实现.(实现方式,重写该方法,写自己的实现体,完成忽视父类的实现)
(3).对于该方法既有父类对该方法的实现,也有子类对该方法的实现.
10.初始化时,本类只对自己独有的实例变量赋值即可.
//super 调用父类对该初始化方法的实现,为从父类继承过来的实例变量赋值.
self = [superinitWithName:namegender:genderage:age];
if (self!=nil) { //为自己独有的实例变量赋值
_number = number;
_score = score;
}
return self;
11.便利构造器
作用:快速创建对象,内部封装了创建对象的过程.
格式:1.+ 号方法 2.返回值类型为id类型
3.以类名+With开头,拼接上多个参数
四.OC之NSString, NSMutableString类
1.API(application programming interface, 应用程序编程接口)
2.不可变字符串各种方法的用法
1.创建对象
2.两种方式:
(1)便利构造器(+号方法)
(2)alloc + 初始化方法
(3)根据字符串初始化OC字符串对象
2.求字符串长度
3.获取字符串中的某个字符
4.判断是否以指定的字符串开头,或者一指定的字符串结尾
5.查找指定字符串的范围
6.字符串截取(获取子字符串)
(1)获取给定下标之后的子串,包含指定下标对应的字符
(2)获取给定下标之前的子串,从下标为0开始,但是不包括指定下标对应的字符
(3)获取指定范围内的子串
7.字符串拼接
8.替换字符串
9.字符串比较
10.字符串和数值类型转换
11.大小写转换操作
3.可变字符串各种方法用法
(1)对于可变字符串的增删改方法,都是在远字符串基础上进行修改,所以修改之后原字符串的内容发生变化,所以无需返回值.
(2)
1.在字符串str基础上拼接Frank
2.在字符串str基础上拼接Frank
3.删除字符串,在原字符串基础上删除henan
4.插入字符串,在原字符串基础上插入lanou
5.替换字符串,在原字符串基础上将第一个Frank替换成Duck
五.OC之NSNumber, NSMutableNumber,NSArray类
NSNumber的方法:
1.定义基本数据类型变量
2.将基本数据类型转为NSNumber类型的对象
3.将NSNumber类型的对象转为基本功数据类型
NSNumber的方法:
1.创建数组对象
2.添加元素
3.插入元素将Duck插入到aa的后面
4.删除元素
5.替换元素
6.交换指定位置的两个元素
7.快速遍历
NSArray的方法:
1. 数组的价值:(1)存储多个元素 (2)存储的元素只能是对象,对象可以是不同类型的. (3)数组是一个有序的集合. (4)数组中的元素可以重复,而且重复的对象会成为数组元素.
2.
1.创建数组对对象
(1) 便利构造器
(2)使用实例初始化
获取元素个数
2.获取元素个数
3.根据索引值获取对象
(1)获取指定下标对应的元素
(2)获取数组中的第一个元素
(3)获取数组中的最后一个元素
4.获取对象在数组中的索引值
5.判断是否包含某个对象
六.OC之字典
1.字典存在的价值:
(1).大容器,用来存储多个数据
(2).用来存储的数据具有--对应的关系(使用key来标识value)
(3).对于字典中的一对键值对(key-value)叫做字典中的一个元素.也叫一个条目,只要是对象就可以,不限制类型.
(4).字典是无序的.
(5).字典中的key是唯一的,一个key只能对应一个value,一个value可以对应多个key.
2.不可变字典
1.创建字典对象
(1) 便利构造器
(2)初始化方法
2.求字典元素个数
3.获取所有的key值
4.根据key获取对应的value
5.字典快速遍历
快速遍历:对于数组来说,遍历得到的是数组中的每一个元素
对字典来说,遍历得到的是字典中的key,然后通过key获取value
3. 可变字典
对于可变字典来说,比不可变字典多了增加,删除,修改操作.
1. 创建对象
2.求字典元素个数
3.删除元素
4.添加元素
5.修改key对应的value
七.Block语法块
1.Block本质上是匿名函数(没有名称的函数)
//int (^)(int x, int y) block变量的类型
//block -- block变量的名字
//^(int x, int y)
//{
// return x + y;
//} ---- block变量的初值,block用来存储函数,所以给block变量赋值时赋的是整个函数的实现.
int (^block)(intx,int y) = ^(intx,int y)
{
return x + y;
};
//当把函数的实现赋给block变量之后,block变量就可以当做函数名使用.
int sum = block(4,7);
NSLog(@"sum =%d", sum);
2.
(1)当在block内部使用block外部定义的局部变量时,如果变量没有被__block修饰,则在block内部是readonly(只读的),不能对它修改,如果想修改,变量前必须要有_block修饰.
(2)__block的作用告诉编译器,编译时在block内部不要把外部变量当做常量使用,还是当做变量使用
(3)如果再block中访问全局变量,不需要__block修饰.
例:
__block int a = 10;
int (^max1)(int x,int y) = ^(int x,int y) {
//variable is notassignable
//变量不可更改
a = 200;
b = 30;
return x * 20;
};
八.属性
1.属性是OC2.0之后出来的新语法,用来代替setter以及getter方法,使用属性可以快速创建setter以及getter方法的声明,setter以及getter方法的实现, 另外添加了对实例变量操作的安全处理. 提供了setter, getter的默认实现
2.setter方法作用:为单一的实例变量赋值.
setter方法规范写法:-号方法,无返回值,名字以set开头 + 要设置的变量的实例变量名(首字母大写):(setter 方法有且只有一个参数) + 参数的类型(和实例变量类型相同) + 参数名(和实例变量名相同). (注意:如果以set开头,并且有多个参数,那么该方法为set方法,不是setter方法)
getter方法的作用:获取单一实例变量的值.
getter 方法命名规范:-号方法,有返回值(返回值类型和实例变量类型相同) 方法名直接和实例变量名相同,无参数.
3.setter以及getter方法.
name 属性名, 指定要实现哪一个属性生成的setter以及getter方法
_name,指定setter和getter方法内部所要操作的实例变量.
4. 属性的属性
第一大特性:读写特性
(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: 针对对象类型,并且要服从NSCopy协议的对象才可以.回复制出一个新的对象,拥有新的对象的所有权.(引用计数+1).(先暂时这么理解)
(3): 针对于对象类型,会造成对象的引用计数+1.
5.点语法,是一种快速访问setter以及getter方法的方式.声明属性默认生成对应的setter以及getter方法.所以属性和setter和getter方法都有关联.
对象.属性名 ---如果在等号的左边,意味着调用setter方法,除次情况,都是调用getter方法.
九.NSDate
1.创建日期对象
(1)创建的NSDate对象,获得的永远是0时区的时间.东八区, 加8个小时.
(2)创建明天此时的日期,后一天
(2) 获取两个日期的时间间隔
(2)比较日期的早晚.
获取两个日期中较早的日期
获取两个日期中较晚的日期
比较两个日期
2.NSDateFormatter 是一个日期格式类,将日期以一个格式进行转换,(原理,转换成字符串). 另外也可将日期格式串转换为NSDate对象
HH表示24小时制, hh 表示12小时制
MM表示月份, mm 表示分钟
dd表示当月天数, DD 表示当天处于本年的第几天.
ss 表示秒数,
如果年份为两个y, 则只显示年份的后两位,如果给其他个数的y,都是显示完整的年份
例如MM等 如果给两位,则月份如果是一位时,前面补
3.将日期格式串转换为NSDate对象
//@"2008-08-08 20:08:08"
//NSString *dateStr = @"2008-08-0820:08:08";
NSString*dateStr = @"2014年05月01日 10点23分18秒";
//创建日期格式化对象(一定要和日期格式串中的日期格式保持一致)
NSDateFormatter*formatter = [[NSDateFormatter alloc] init];
//设置日期格式
[formattersetDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//将格式字符串转化为NSDate对象
NSDate *date =[formatter dateFromString:dateStr];
NSLog(@"%@", date);
4.将日期格式串转换为NSDate对象
//@"2008-08-08 20:08:08"
//NSString *dateStr = @"2008-08-0820:08:08";
NSString*dateStr = @"2014年05月01日 10点23分18秒";
//创建日期格式化对象(一定要和日期格式串中的日期格式保持一致)
NSDateFormatter*formatter = [[NSDateFormatter alloc] init];
//设置日期格式
[formattersetDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"];
//将格式字符串转化为NSDate对象
NSDate *date =[formatter dateFromString:dateStr];
NSLog(@"%@", date);
十.动态数组创建
十一.Cagegory,Extension, Protocol
1. Category(分类,类目) 的定义和使用
2.
Extension 延展的主要作用:为类添加”私有”方法.
面向对象编程(Object Oriented Programming,OOP)的另外一个名字叫做面向接口编程.
我们在设计一个类的时候,有些方法需要对外公开(接口), 有些方法可能仅仅内部使用.
Extension 的功能是帮助我们去管理这些内部使用的方法(私有方法).
Extension 针对的是自己的类,必须有源代码的类.
延展 也是扩充类的功能的一种方式,只不过延展扩充的内容是私有的,是在.m文件中定义的.
延展 即可以扩展方法也可以扩展实例变量,只不过都是私有的, 外界无法直接访问.
延展 是为有源代码的类扩充内容.(extension)
3. Protocol 协议
Protocol, 是iOS开发中常用的技术
协议是一套标准(一堆方法的声明), 只有.h文件
接受协议的对象实现协议中定义的方法.
十二.内存管理
1.iOS应用程序出现Crash(闪退), 90%以上的原因都是内存问题.
2.内存问题体现在两个方面:内存溢出,野指针异常,内存过度释放
3.了解内存管理,能帮助我们提升性能,大大减少调试bug时间.
4.垃圾回收 (Garbage Collection, gc);
MRC (ManualReference Count, 人工引用计数) 遛狗原理 关灯原理
ARC(AutoReference Count, 自动引用计数)
5.
+alloc 开辟一个新的空间,引用计数由0变为1
-retain 必须要有对象,计数+1
-copy 创建一个新的一样的对象,计数由0变为1
-release 引用计数-1
(使用release的时候,如果计数为0的话,系统会立即调用dealloc方法,如果我们想看是否系统调用了dealloc方法,可以通过重写dealloc方法来实现.)
eg:
//重写父类NSObject的dealloc方法
- (void)dealloc
{
NSLog(@"空间回收了”);
//向控制太输出一句话,提示当release计数为0的时候,立即调用了dealloc方法.
[super dealloc];
}
6.-autorelease 在将来的某一个时刻,引用计数-1. 如果内存之前引用计数为4,autorelease之后引用计数为4, 在将来的某个时刻会变为3
7. 内存管理基本原则:
如果你对一个对象进行alloc, retain, copy之后,你就拥有了该对象的所有权,你就必须对他进行release或者autorelease.
8.NSAutoreleasePool的工作机制:
当创建的对象未来某个时候销毁时,可以使用对象的autorelease方法。
对象将所有权交给最近的NSAutoreleasePool对象。
当autoreleasepool执行结束时,会向池内的对象发送release消息.
autorelease的对象是延迟释放所有权。
尽量不要使用autorelease,而是使用release。(因为如果使用autorelease的时候,会延迟释放所有权,当在一个无穷大的循环中,不断的创建空间,而延缓释放所有权,会增加系统内存,造成crash)
十三.NSCopy
想对一个对象进行copy操作,对象的类必须服从一个NSCopying协议,并且实现协议中的方法.
十四.KVC
1. KVC——— key - value - coding 键值编码
2. KVC是一种间接访问实例变量的方式,通过指定的key来找到对应的实例变量.(切记key是字符串)
3. KVC 的工作原理:根据指定的key, 比如:name,
(1)先查找该类是否有对应的settter方法: 比如:setName:如果有,则通过setter方法给实例变量赋值,如果没有,则转到(2)
(2)查找该类有没有一个_+key的实例变量,比如_name,如果有,则给_name赋值,如果没有, 则转到(3).
(3)查找该类是否具有一个和key同名的实例变量,比如:name, 如果有, 则给name赋值, 如果没有,则转到(4)
(4)如果没有找到,系统会抛出一个NSUnknownKeyException,说明没有找到可匹配的key,(也就是该类既没有setName:, 也没有_name, 也没有name.)
4.
//当给定的key未匹配到对应的方法以及实例变量时,会自动调用该方法,所以只需实现该方法即可,(实现体中可以没有实现内容)
- (void)setValue:(id)valueforUndefinedKey:(NSString *)key
{
NSLog(@"undefinedkey");
}
- OC 总结
- OC 总结
- OC总结
- OC总结
- OC总结
- OC总结
- OC总结
- OC-总结
- OC总结
- OC总结
- oc总结
- OC总结
- OC-总结
- OC总结
- OC 总结
- OC总结
- OC总结
- OC总结
- JMS深入浅出
- 图形学创世纪:当科学照进影视与生活
- Visual Studio 2013下使用SVN
- UVA 657-The die is cast(双重BFS)
- "右键发送" 造成死机,解决方法,实验管用
- OC总结
- 数据库学习--全文本搜索
- hdu1234
- C++单体模式学习草稿
- Objective-C学习阶段的知识点总结
- HDU 1195 Open the Lock BFS
- ZOJ 1160 Biorhythms
- 关于ajax与注解详解
- Zony Save Manager