黑马程序员技术交流社区
标题: OC基础类与对象进阶个人笔记 [打印本页]
作者: muyan091115 时间: 2016-5-24 23:30
标题: OC基础类与对象进阶个人笔记
1,OC在C基础之上
1),增加了面向对象的语法
2),将C语言中复杂的繁琐的语法封装的更为简单
2,更为简单
1),#import指令
同一个文件 无论#import多少次 最终只会包含一次 不会出现重复包含
2),NSLog()函数
a,自动换行
b,会输出一些其他的调试信息
3),NSString
a,OC字符串常量和C字符串常量区别:OC的前面有@
b,NSString 只能存储OC字符串常量
NSString *str = @“jack”
4),数据类型
BOOL : YES NO
Boolean : true false
class id nil SEL block类型
3,面向对象的语法
1),面向过程,面向对象的理解
2),面向对象最大的优点: 极大的提升可维护性。
3),类与对象 及其之间的关系
4),设计类的三要素 a,类名(名词提炼法) b,特征 c,行为
4,类与对象
1),如何去定义一个类
a,位置 b,语法 c,使用
2),方法的声明和实现
a,声明和实现的位置 b,实现的语法 c,方法命名规范
5,对象的创建与访问
类名 *对象名= [类名 new];
对象的特点:又有类定义中所有的成员
对象中的成员可以直接访问。
对象名->属性 (*对象名)属性
[对象名 方法名] [对象名 方法名 :实参]
6,同一个类可以创建无数个对象 并且对象两两之间毫无关系
在方法中直接访问属性,访问的就是当前对象的属性。
1,内存中的五大区域
栈:局部变量
堆:程序猿手动申请的内存空间 malloc calloc realloc 函数分配的。
BSS段:存储未被初始化的全局变量,静态变量
数据段:存储已经被初始化的全局变量,静态变量,常量
代码段:存储代码
2,类加载
1),在创建对象的时候,肯定是需要访问类的
2),声明一个类的指针变量的时候,也是需要访问类的
在程序运行期间,当某个类第一次被访问的时候,就会将这个类存储到内存中的代码段中去
这个过程叫做类加载。
只有类在第一次被访问的时候,才会被加载,所以类只会被加载一次
一旦类被加载到代码段以后,直到程序结束的时候才会被释放。
3,对象在内存中究竟是如何存储的?
假设下面的代码写在函数之中
Person *p1 = [Person new];
1),Person *p1;
声明了一个Person 类型的指针变量 是局部变量
会在栈内存中申请一块空间,在栈内存中声明一个Person类型的指针变量叫做p1。
p1是一个指针变量,只能存储地址。存储的是堆中的存储对象的地址。
2),[Person new] 真正创建对象的其实是这句代码
new做的事情
a,在堆内存中申请一块合适的大小的空间
b,在空间中根据类的模版创建对象
看类模块中定义了什么属性,就把属性依次声明在对象当中
对象中还有另外一个属性 叫做isa 是一个指针。
这个指针指向对象所属的类在代码段中的地址
c,初始化对象的属性
如果属性的类型是基本数据类型 赋值为0
如果属性类型是C语言的指针类型 那么赋值为NULL
如果属性类型是OC语言的类指针类型 那么就赋值为nil
d,返回对象的地址
3),注意
a,对象中只有属性,没有方法。自己的属性外加一个isa指针指向代码段中的类
b,如何访问对象的属性
指针名->属性名
根据指针 找到指针指向的对象,再找到对象中的属性进行访问
c,如何调用方法[指针名 方法名]
根据指针名 找到对象 对象发现腰调用方法,跟根据对象的isa指针找到类,
然后调用类中的方法。
4,为什么不把方法存储在对象之中?
每个对象的属性是没有关联的,是不一样的 ,但是方法都是一样的。
没必要都为对象保存,这样太浪费空间了
5,对象的属性的默认值问题
如果我们创建一个对象 没有为对象的属性赋值
那么这个对象的属性是有值的 默认值
如果属性的类型是基本数据类型 赋值为0
如果属性类型是C语言的指针类型 那么赋值为NULL
如果属性类型是OC语言的类指针类型 那么就赋值为nil
作者: muyan091115 时间: 2016-5-24 23:31
1,NULL
可以作为指针变量的值如果1个指针变量的值时NULL 代表这个指针不指向任何内存空间
NULL其实等价于0 NULL其实是一个宏 就是0
2,nil
只能作为指针变量的值,代表着指针不指向内存红枣南瓜的任何空间
nil其实也等价于0 也是一个宏 就是0
所以,NULL和nil其实是一样的
3,使用建议
虽然语法上都一样,可以互换,但是不建议乱用
规范:
C的指针用NULL;
int *p = NULL; p1指针不指向任何内存中的空间
OC的类指针用nil;
Person *p1 = nil; p1指针不指向任何对象
4,如果一个类指针的值为nil,代表这个指针不指向任何对象
Person *p1 = nil;
那么这个时候,如果通过p1指针去访问p1指针指向的对象的属性,这个时候就会运行报错。
如果通过p1指针去访问p1指针指向的对象的方法,这个时候运行不会报错,但是方法不会去执行,没有反应。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |