标签:
类的作用: 允许我们自定义一个新的数据类型, 这个数据类型的变量中是由多个小变量和行为联 合而成的
类的本质: 自定义的一种数据类型. 但是类本身仅仅是创建的一个新的数据类型, 并不能够直接拿来使用
属性: 是在创建对象的时候, 跟随对象一创建在其中, 属性是属于对象的
1. 内存存储和类在内存中的存储
1. 内存中的五大区域
2. 类加载: 当我们创建对象的时候, 肯定需要访问这个类, 因为只有访问了类才知道类中有哪些成员.
就算只是声明了一个类指针, 也是会访问这个类的, 以确定这个类是否存在
当类第一次被访问的时候, 会将类存储到代码段中,——类加载
这个过程不会有属性的声明, 只是单纯的代码加载(当然实际上并没有这么简单)
这个过程的持续时间: 从加载到程序结束
2. 对象声明在内存中的存储过程
1. 对象的声明
LHPerson *p1; //假设已有一个继承自NSObject的LHPerson类
2. 上述语句只是简单的声明了一个指针变量, 这个指针变量的类型是LHPerson类型.
3. p1是一个局部的变量, 所以p1指针变量存储在栈区
4. [LHPerson new] 这部分, 才是真正的创建对象
首先, 在堆内存中申请一块合适大小的空间; [LHPerson alloc]
然后, 在申请的这块空间里面根据类的模板创建对象;
类中有哪些属性, 就把这些属性挨个的声明在这个对象中.
其中, 还有另外一个属性—isa ,这是一个指针, 指向的是在代码段其所属的类
5. 初始化对象的属性, 为对象的属性赋默认值
如果是基本数据类型, 缺省为0;
如果是C指针类型, 缺省为NULL;
如果是OC指针类型, 缺省为nil;
6. 返回这个对象在堆空间的地址
将这个地址赋值给栈区的 p1指针
这时候, p1指向的就是堆区的LHPerson对象
3.方法和类的存储和结构
1. 对象之中只有类的属性 再加 一个 isa 的指针, 没有方法
2. 通过指针, 找到的是这个指针指向的对象→通过这个指针就找到了对象中的属性
3. 通过指针变量, 找到了堆区中的对象, 再通过对象中的isa指针找到代码段中的类中的方法
4. 为什么方法不存在于对象中: 因为不管对象有多少个, 方法的代码都是一样的, 就没有必要保存多份了
4. NULL
1. 是一个值, C语言中指针变量的值
2. 如果一个指针的值为NULL, 就代表这个指针不指向内存中的任何空间
3. NULL本质上是一个宏→ #define NULL ((void *)0);
5. nil
1. 也是一个值, 也是一个指针变量的值
2. 本质上也是一个宏,
#define _DARWIN_NULL ((void *)0);
所以, 从这里看出来, nil 和 NULL 基本是等价的
6. nil 和 NULL
1. NULL给C指针
2. nil给OC指针
7. 如果一个LHPerson *p1 = nil;
这时候, 它不指向任何对象,
1. 无法通过p1去访问属性
2. 虽然调用方法不会报错, 但是方法并不会执行.
类型相同的OC类指针变量之间是可以相互赋值的
1. LHPerson *p1 = [LHPerson new];
LHPerson *p2 = p1;
这个时候, p1和 p2 指向了同一个对象.
无论通过 p1 指针去访问对象, 还是通过p2 指针去访问对象, 访问的都是同一个对象
OC多文件开发一般做法:
1. 一个类就是一个模块, 一个模块至少分两个文件
.h文件 头文件, 声明文件
.m文件 实现文件
对象作为方法的参数
1. 参数的类型
-(void) 方法名:(声明好的类名 *)形参名
2. 在调用这个方法的时候, 实参对象要和形参要求一致
3. 对象传递是 地址 传递
传递完以后, 形参指针和实参指针其实指向的是同一个对象.
在方法的内部, 通过形参指针访问对象的时候, 实际上访问的就是这个对象
对象作为方法的返回值
1. 肯定是可以作为返回值的
返回值应该是一个类指针类型的
-(LHPerson)buyPerson;
代表方法执行完毕之后,
2. 注意!!!
由于对象都是存储在堆区, 所以即便是方法结束了以后, 对象依然存在
3. 实质上, 返回的是一个类指针, 即在方法中新建的对象的地址
类的属性
1. 类的属性代表的是这个类所拥有的东西
2. 分析类的属性? (共同)有什么, 就是什么
类的方法
1. 类的方法代表这个类所具备的行为, 这个类所具备的功能
对象作为类的属性——结构体嵌套
1. 属性的本质是变量
在创建对象的时候, 对象中的属性是按照类末班中的规定挨个创建出来的
类模板中属性是什么类型, 那么对象中的属性就是什么类型
如果对象的属性是另外一个对象, 这个属性仅仅是一个指针变量而已, 并没有对象的产生, 这个时候, 还要为这个属性赋值一个对象的地址, 才可以正常使用
2. A类可以作为B类的属性, 代表的是B拥有A
属性仅仅是一个变量而已, 这个时候的在B中, 所拥有的A暂时也只是一个指针变量, 并没有new出一个新的对象
所以如果这时候要正常使用的话, 还要为B对象的A属性赋值一个对象
标签:
原文地址:http://www.cnblogs.com/SquirrelStock/p/5463672.html