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
|