OC总结

一.  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中只允许单继承.

被继承的类为父类(superclass), 也称为超类,

继承的类称为子类(subclass).

 

 

9.继承时的方法会存在三中情况:

(1).保留父类对该方法的实现,(实现方式,不重写方法)

(2).按子类重写之后的方式来实现.(实现方式,重写该方法,写自己的实现体,完成忽视父类的实现)

(3).对于该方法既有父类对该方法的实现,也有子类对该方法的实现.

 

10.初始化时,本类只对自己独有的实例变量赋值即可.

 

   //super 调用父类对该初始化方法的实现,为从父类继承过来的实例变量赋值.

   self = [superinitWithName:name gender: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 延展的主要作用:为类添加”私有”方法.

 

面向对象编程(ObjectOriented Programming, OOP)的另外一个名字叫做面向接口编程.

 

我们在设计一个类的时候,有些方法需要对外公开(接口), 有些方法可能仅仅内部使用.

 

Extension 的功能是帮助我们去管理这些内部使用的方法(私有方法).

Extension 针对的是自己的类,必须有源代码的类.

 

延展 也是扩充类的功能的一种方式,只不过延展扩充的内容是私有的,是在.m文件中定义的.

延展 即可以扩展方法也可以扩展实例变量,只不过都是私有的, 外界无法直接访问.

延展 是为有源代码的类扩充内容.(extension)

3. Protocol 协议

Protocol, 是iOS开发中常用的技术

协议是一套标准(一堆方法的声明), 只有.h文件

接受协议的对象实现协议中定义的方法.

 

 

十二.内存管理

1.iOS应用程序出现Crash(闪退), 90%以上的原因都是内存问题.

2.内存问题体现在两个方面:内存溢出,野指针异常,内存过度释放

3.了解内存管理,能帮助我们提升性能,大大减少调试bug时间.

 

4.垃圾回收 (Garbage Collection, gc);

MRC (Manual Reference Count, 人工引用计数) 遛狗原理 关灯原理

ARC(Auto Reference 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值