Objective-C笔记
- .m文件代表的是message,指的是OC的一种主要特性。
- #import是让编译器在头文件中查询定义
- 框架是一种聚集在一个单元的部件集合,包含头文件,库,图像,声音文件等,Foundation框架的头文件Foundation.h包含一百多个文件,一旦使用
#import<Foundation/Foundation.h>
, 那么将会获得全部集合。 - argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数,char *argv[]是一个字符数组,其大小是int argc,主要用于命令行参数argv[]参数,数组里每个元素代表一个参数
- 特别的.h文件和.m文件build之前一定要将.h文件右键properties->advance下的compiler…改为objc,这在环境搭建的blog也有提到
创建类
1 | //头文件Fraction.h |
构造子,先看一下构造函数和析构函数 的区别。
1 | //.h里面的声明 |
- self 是指指向自己的指针
Class level access
- 前面带有减号(-) 的方法为实例方法,必须使用类的实例才可以调用的。对应的有+号, 代表是类的静态方法,不需要实例化即可调用。
1 | //ClassA.h |
类方法用类名访问,实例方法用示例名访问。静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。
类方法可以计算一个实体被instance几次,还可以共享数据,它不需要访问或者修改某个实例的成员变量。类方法一般用于实现一些工具方法,比如对某个对象进行扩展,或者实现单例。如果需要访问或者修改某个实例的成员变量时,将该方法定义成实例方法。如果需要访问或者修改某个实例的成员变量时,将该方法定义成实例方法。
插入一点:windows要通过各种各样的句柄来标识诸如应用程序实例,窗口,图标菜单等对象。句柄的实际值对程序来讲无光紧要,这个值是用来引用相应对象的。句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。
这里留给异常
继承多态以及其他实体导向功能
ID类型
- Objective-C有一种id的类型,操作有些像void*,不过它却严格规定只能用在实体上。Objective-C与Java、C++不一样,在调用一个实体的方法时,并不需要知道这个实体的类型。当然,这个方法一定要存在,在称为Objective-C的消息传递。这种动态连接有显而易见的好处。你不需要知道你调用的方法的那个实体是什么类型,如果这个实体对这个消息有反应,那就会调用这个方法。这也不会牵涉到一堆繁琐的类型转换,比如在Java里调用一个整形实体的.intValue()就要先转换,然后才能调用这个方法。
1 | id number; |
继承
关于_self=[super init] ,下面一段代码
- [super init]的作用:面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化。在iOS下,所有的类都继承于NSObject,而NSObject的init方法很简单,就是return _self。当父类的初始化完成之后,即_self不为nil的情况下,就可以开始做子类的初始化了。
- 把[_self init]付给_self,防止父类release掉了self指向的空间并重新获得alloc了一块空间,如果[self init]alloc失败,则不执行if语句内容。
- super作为消息接受者的实质:super并不是真正的指针,[super message]的实质是由self来接受父类的message。需要注意的是,[super message]中,message方法出现的self为[super message]语境中的self,即子类实例。
1 | _self=[super init]; |
- 重要一点:if( self = [super init] )这是一种通常的建议写法,赋值并测零只是为了防止超类在初始化过程中发生改变,返回了不同的对象
注:所有self前面均无_,只是hexo的时候会报错,所以选择加上