类加载
在创建对象的时候,肯定是要访问类的声明一个类的指针变量也会访问类的在程序运行期间,当某个类第一次被访问到的时候,会将这个类存储到内存中的代码段区域,这个过程叫做类加载。只有在类第一次被访问的时候,才会做类加载。一旦类被加载到代码段以后,直到程序结束的时候才会被释放。
对象在内存中究竟是如何存储的
//假设以下的代码是写在函数之中的
int main(int arc, const char * argue[]) {
Person *p1 = [Person new];
return 0;
}
Person *p1; 会在栈内存中申请一块空间,在栈内存中声明一个Person类型的指针变量p1 p1是一个指针变量 只能存储地址 [Person new]; 真正创建对象的是这段代码 new做的事情:1.在堆内存中申请一块合适大小的空间 2.在这个空间中根据类模版创建一个对象 3.类模版中定义了什么属性,就把这些属性依次声明在对象之中 4.额外定义isa属性,isa属性是一个指针,指向对象所属的类在代码段中的地址 5.初始化对象的各个属性,给各个属性赋一个初值。 如果属性类型是基本数据类型,那么赋值为0 如果属性类型是C语言指针类型,那么赋值为NULL 如果属性类型是OC语言指针类型,那么赋值为nil 6.返回对象的地址对象中只有属性,没有方法。自己类的属性加上一个isa指针指向代码段中的类 访问对象中的方法:[指针名 方法名]; 先根据指针名找到对象,对象发现要调用方法,在根据对象的isa指针找到类,然后调用类里的方法由于每个对象的方法的代码都是一摸一样的,没有必要为每个对象都保存一个方法,这样太浪费存储空间,所以只保持一份
nil与NULL
nil:只能作为指针变量的值,代表这个指针变量不指向内存中的任何空间。等价于0,是一个宏定义,就是0。nil和NULL其实是一样的。 NULL:只能作为指针变量的值,代表这个指针变量不指向内存中的任何空间。等价于0,是一个宏定义,就是0。使用建议:虽然使用NULL的地方可以使用nil,使用nil的地方可以使用NULL,但是不建议大家去使用。C语言指针用NULL,OC语言的类指针用nil如果一个类指针的值为nil,代表这个指针不指向任何对象。这个时候如果通过这个类指针去访问该类指针指向的对象的属性,会运行报错;访问调用对象的方法,运行不会报错,但是方法不会执行。
分组导航标记
//在导航条对应的位置先产生一条水平分割线,再显示标题
#pragma mark - XX类的声明
@interface XX:NSObject {
}
@end
#pragma mark - XX类的实现
@implementation XX
@end
容易出错的点
@interface 和 @implementation 之间不能相互嵌套类必须要先声明,后实现。类的声明必须放在使用类前面,类的实现可以放在类的实现后面类的声明和实现必须都要有,即使没有方法,也需要有类的实现属性名一定要以下划线开头,类名每个单词首字母要大写属性不允许声明的时候初始化。在为类写一个属性的时候,不允许在声明的时候为属性赋值OC方法必须要创建对象通过对象名来调用;如果方法只有声明,没有实现,编译器会给一个警告,不会报错;如果一个指针指向的对象,有方法的声明,没有方法的实现,那么这个时候通过指针调用这个方法,在运行的时候,就会报错
多文件开发
推荐的方式:把一个类写在一个模块中,一个模块至少包含两个文件,一个.h头文件,写类的声明 @interface 由于要用到NSObject 所以在头文件中引入Foundation框架的头文件;一个.m文件,写类的实现 @implementation 在头文件要引入.h声明文件。
如果要用到类,只要引入这个模块的头文件就可以直接使用了。
文章来源
发表评论