类加载
- 在创建对象的时候,肯定是要访问类的
- 声明一个类的指针变量也会访问类的
- 在程序运行期间,当某个类第一次被访问到的时候,会将这个类存储到内存中的代码段区域,这个过程叫做类加载。只有在类第一次被访问的时候,才会做类加载。一旦类被加载到代码段以后,直到程序结束的时候才会被释放。
对象在内存中究竟是如何存储的
//假设以下的代码是写在函数之中的
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声明文件。
原文地址:https://blog.csdn.net/Ls_attack/article/details/127241619
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_25424.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。