oc 里的匿名对象
oc 这里,很少用到,因为并不适用于oc的内存管理,只是面试笔试也许出现,要求能看懂,不要在项目里这样写,因为写匿名对象,会造成内存泄露


能看懂什么意思就行
成员变量都以下划线 _ 开头
可以跟get方法的名称区分开
可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是类的成员变量
1、oc是动态检测错误,oc里调用一个没有声明也没有实现的对象方法,则不会编译报错而是警告,链接也能通过,只有运行才检测出错
2、oc里调用只有声明,但是没有实现的对象方法,这编译也是警告,链接通过,运行才出错
3、oc调用只有实现(没声明)的方法,则没有问题!因为运行时才检测程序的问题,声明其实只是摆设,删掉是没事的。只不过开发中,必须规范!该写都要写上。即使不报错。
直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)
1. 类方法和对象方法对比
1) 对象方法
减号-开头
只能让对象调用,没有对象,这个方法根本不可能被执行
对象方法能访问实例变量(成员变量)
2) 类方法
加号+开头
只能用类名调用,对象不能调用
类方法中不能访问实例变量(成员变量)
使用场合:当不需要访问成员变量的时候,尽量用类方法
3) 类方法和对象方法可以同名
4) 提高程序性能
类方法的好处和使用场合:不依赖于对象,执行效率高, 能用类方法,尽量用类方法
self 关键字用来指明对象是当前方法的接收者。
当成员变量和局部变量同名时,采取就近原则,访问的是局部变量
用self访问成员变量,区分同名的局部变量
细节:
1) 出现的地方:可以出现在所有的oc方法中(对象方法\类方法),但是不能出现在函数里
2) 作用:
使用 "self->成员变量名" 访问当前方法调用的成员变量
使用 "[self 方法名];" 来调用方法(对象方法\类方法)


低级错误:
用self去调用函数
类方法中用self调用对象方法,对象方法中用self调用类方法
self死循环


原则上(如果不使用 arc,也就是自动引用计数),那么
创建一个新对象,都要请求分配内存,在完成对该对象的操作时,必须释放其所用的内存空间。类似 c++的内存管理。
与 c 语言兼容的地方:
预处理:
#define 语句和 c 一样
#运算符: #define str(x) #x
表示在调用该宏时,预处理程序根据宏参数创建c 风格的常量字符串。
例如:str("hello")将产生"\"hello"\"
##运算符: 表示用于把两个标记连在一起
#import 语句;相当于#include 语句,但是 #import 可自动防止同一个文件被导入多次。
#条件编译语句(#ifdef 、#endif 、 #else 、 #ifndef)和 c 一样
#undef 语句 消除特定名称的定义
其他基本的c 语言特性:
数组、函数、指针、结构、联合的用法和c 一样。
compound literal 是包含在括号之内的类型名称,之后是一个初始化列表。
例如
如果 intptr 为 int * 类型:
intptr = (int[100]){[0] = 1, [50] = 50, [99] = 99};
如果数组大小没有说明,则有初始化列表确定。
其他如循环语句 (do while、while、for) 、条件语句(if 语句(if-else、复合判断条件等) 、switch 语句)、 boolean(yes no)、条件运算符、goto 语句、空语句、逗号表达式、sizeof 运算符、命令行参数、位操作都 和 c 一样 。
oc 的继承
oc的继承只支持单一继承,和java类似,也就是儿子只能有一个爸爸,但是
可以通过 objective-c 的分类和协议特性获取多继承的优点
而c++支持单一和多重继承。
好处:
不改变原来模型的基础上,拓充方法
建立了类与类之间的联系
抽取了公共代码
坏处:
耦合性强
基本上所有类的根类是nsobject类
如图:
animal类拥有nsobject类的new方法,子类dog和cat同时拥有前两层类的所有方法和属性。类似 c++和 java


oc 继承里的细节(类似其他面向对象语言)
父类必须声明在子类的前面
子类和父类不能有相同的成员变量,但是方法可以重写
方法的重写问题:子类重新实现父类中的某个方法,也就是覆盖了父法
调用某个方法时,优先去当前类中找,如果找不到,去父类中找
这是内部原理。
每个对象都有一个isa指针,指向对象属于的类,且记住:每个类里(oc的)都有一个superclass指针,指向自己的父类。
这样通过对象就能找到对象属于的类,也能找到类的父类。而这些指针就在nssobject类里。
内存结构:
继承的使用场合
1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
2> 当a类完全拥有b类中的部分属性和方法时,可以考虑让b类继承a类
// 继承:xx 是 xxx
// 组合(也叫聚合关系):xxx 拥有 xxx
super关键字
实现重写之后,还可以调用父类的对象方法和类方法,super的作用;直接调用父类中的某个方法
1、super处在对象方法中,那么就会调用父类的对象方法
2、super处在类方法中,那么就会调用父类的类方法
使用场合:
子类重写父类的方法时想保留父类的一些行为。
在oc里,简单的多,调用某方法,先是在所在类就近找,找不到去父类找。太简单了。如果重写了父类方法,那么只能调用子类重写的这个方法了,如果想保留父类原方法定义的功能,可以用super。
oc 的多态
多态的体现
person *p = [student new];
p->age = 100;
[p walk];
子类对象赋值给父类指针,父类指针访问对应的子类的继承来的属性和方法
多态的局限性
不能访问子类的特有的属性或方法(可以考虑强制转换)
多态的细节
动态绑定:在运行时根据对象的类型确定动态调用的方法
注意点:
1.没有继承就没有多态
2.代码的体现:父类类型的指针指向子类对象
3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类、或者子类对象
4.局限性:父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法(类似c++的赋值兼容)


多态的局限性:
父类类型的变量 不能 直接 调用子类特有的方法。
联系c++
c++是使用了虚函数,(包括纯虚函数和抽象类)对公有继承的子类的方法,重写虚函数,父类指针或者引用指向子类,那么就能调用子类的重写虚函数,指向父类,就是调用父类的虚函数,实现动态联编。
oc里,没有那么复杂,就是直接子类继承父类,那么重写父类某个对象方法,这只需要父类指针指向子类对象,那么就调用子类的重写方法,同样也不能调用子类特有的方法。
由此断定,oc的方法都是虚方法!不用和c++一样用virtual声明!且oc的重写也是多态的一种,oc里所有的方法访问属性都是公有的!而类成员变量默认是保护的。和c++有些区别,c++是默认都是私有的。
再看oc的弱语法!比如把子类对象指针指向父类
c++里肯定错误,但oc里没问题,只警告,但这样不好,不推荐。完全没道理。
再看:
动物怎么了成了字符串对象了?oc里xcode不报错!但是绝对是不对,不规范。还有,同一个层次的类,猫类指针指向狗类对象,调用eat方法,在oc的弱语法下,还是没问题的,调狗的eat。
oc太弱了!但是在c++里直接就报错了。不可以这样写,即使编译器不报错。
多态的好处
用父类对象接收参数,方法或者函数,即可以接受子类对象,也能接受父类对象,节省代码。否则还要分开写多个方法或者函数。
充分体现面向对象的抽象和具体,通过子类重写继承来的父类的虚方法(oc默认都是),通过父类指针指向子类对象,实现动态多态性!不看指针的类型,而是看指针指向的哪个对象类型,就调用哪个子类对象的虚方法。注意子类特有的方法不可以,必须强转。
辛苦的劳动,转载请注明出处,谢谢……
http://www.cnblogs.com/kubixuesheng/p/4311257.html