首页 > 代码库 > OC相关总结

OC相关总结

1、id 万能指针为什么不可以用点语法,但是它可以调用任何方法
2、// 构造方法:用来初始化对象的方法,是个对象方法,- 开头

// 重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值

/*

 重写构造方法的注意点

1.先调用父类的构造方法([super init])

2.再进行子类内部成员变量的初始化

3、封装:是指对对象属性的封装

4、OC的弱语法

// OC是在运行过程中才会检测对象有没有实现相应的方法

// 一旦运行过程中出错,就会闪退

/*

 -[Person test]: unrecognized selector sent to instance 0x7fd2ea4097c0

 给Person对象发送了一个不能识别的消息:test

 */

5、/*对象方法

 1> 减号 - 开头

 2> 只能由对象来调用

 3> 对象方法中能访问当前对象的成员变量(实例变量)

 类方法

 1> 加号 + 开头

 2> 只能由类(名)来调用

 3> 类方法中不能访问成员变量(实例变量)

  类方法的好处和使用场合

 1> 不依赖于对象,执行效率高

 2> 能用类方法,尽量用类方法

 3> 场合:当方法内部不需要使用到成员变量时,就可以改为类方法

  可以允许类方法和对象方法同名 */

6、self->_age、_age、self.age


7、self的用途:

 1> 谁调用了当前方法,self就代表谁

 * self出现在对象方法中,self就代表对象

 * self出现在类方法中,self就代表类

  2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量

  2> [self 方法名]可以调用其他对象方法\类方法

8、1.继承的好处:

 1> 抽取重复代码

 2> 建立了类之间的关系

 3> 子类可以拥有父类中的所有成员变量和方法

 2.注意点

 1> 基本上所有类的根类是NSObject

9、1.重写:子类重新实现父类中的某个方法,覆盖父类以前的做法

 2.注意:

 1> 父类必须声明在子类的前面

 2> 子类不能拥有和父类相同的成员变量

 3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找

 2.坏处:耦合性太强

10、super的作用

 1.直接调用父类中的某个方法

 2.super处在对象方法中,那么就会调用父类的对象方法

   super处在类方法中,那么就会调用父类的类方法

 3.使用场合:子类重写父类的方法时想保留父类的一些行为

11、多态

 1.没有继承就没有多态

 2.代码的体现:父类类型的指针指向子类对象

 3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象

 4.局限性:

 1> 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法

12、多态其它书上还有一种说法(感觉不是很正确)

多态是指相同的消息给与不同的对象会引发不相同的动作 

13、方法

 1.对象方法都是以减号 - 

 2.对象方法的声明必须写在@interface和@end之间

   对象方法的实现必须写在@implementation和@end之间

 3.对象方法只能由对象来调用

 4.对象方法归类\对象所有

 函数

 1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有

 2.函数调用不依赖于对象

 3.函数内部不能直接通过成员变量名访问某个对象的成员变量

14、内存管理

1.方法的基本使用

 1> retain :计数器+1,会返回对象本身

 2> release :计数器-1,没有返回值

 3> retainCount :获取当前的计数器

 4> dealloc

  * 当一个对象要被回收的时候,就会调用

  * 一定要调用[super dealloc],这句调用要放在最后面

 2.概念

 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用

 2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)

 3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错

15、@property参数 

1.set方法内存管理相关的参数

 * retain : release旧值,retain新值(适用于OC对象类型)

 * assign : 直接赋值(默认,适用于非OC对象类型)

 * copy   : release旧值,copy新值

 2.是否要生成set方法

 * readwrite : 同时生成setter和getter的声明、实现(默认)

 * readonly  : 只会生成getter的声明、实现

 3.多线程管理

 * nonatomic : 性能高 (一般就用这个)

 * atomic    : 性能低(默认)

 4.setter和getter方法的名称

 * setter : 决定了set方法的名称,一定要有个冒号 :

 * getter : 决定了get方法的名称(一般用在BOOL类型)

16、循环引用

1.@class的作用:仅仅告诉编译器,某个名称是一个类

 @class Person; // 仅仅告诉编译器,Person是一个类

 2.开发中引用一个类的规范

 1> 在.h文件中用@class来声明类

 2> 在.m文件中用#import来包含类的所有东西

 3.两端循环引用解决方案

 1> 一端用retain

 2> 一端用assign

17、ARC的基本使用

 ARC的判断准则:只要没有强指针指向对象,就会释放对象

 1.ARC特点

 1> 不允许调用release、retain、retainCount

 2> 允许重写dealloc,但是不允许调用[super dealloc]

 3> @property的参数

  * strong :成员变量是强指针(适用于OC对象类型)

  * weak :成员变量是弱指针(适用于OC对象类型)

  * assign : 适用于非OC对象类型

 4> 以前的retain改为用strong

 指针分2种:

 1> 强指针:默认情况下,所有的指针都是强指针 __strong

 2> 弱指针:__weak

18、成员变量的作用域(在分类中能访问哪一类成员变量?)

@public : 在任何地方都能直接访问对象的成员变量

 @private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)

 @protected : 可以在当前类及其子类的对象方法中直接访问  (@interface中默认就是@protected)

 @package : 只要处在同一个框架中,就能直接访问对象的成员变量

 @interface和@implementation中不能声明同名的成员变量

 

 

OC相关总结