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 = @"20140501 102318";

        //创建日期格式化对象(一定要和日期格式串中的日期格式保持一致)

        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 = @"20140501 102318";

        //创建日期格式化对象(一定要和日期格式串中的日期格式保持一致)

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

        //设置日期格式

        [formattersetDateFormat:@"yyyyMMdd HHmmss"];

        //将格式字符串转化为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");

}

 


0 0
原创粉丝点击