OC封装继承和实例化
[Person new] 做了三件事:
1)申请内存空间
2)给实例初始化
3)返回空间首地址
实例变量保存在堆区
``指针(对象名)保存在栈区
对象方法保存在代码区
调用方法先找到p所指向的堆区的指针—isa然后再找到isa所指向的代码区的方法
对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数来调用
函数属于整个文件,函数的声明可以在main内部,也可以在main函数外面,除了@interface @end之间
函数:
1)所以函数都是平行的
2)函数不存在隶属关系
3)使用时可以直接掉用
4) 不可以访问对象中的成员变量
@interface @end 不可以嵌套
在声明时不可以对成员变量初始化
成员变量和方法不可以用static修饰
[Person new]做了三件事:
1)申请内存空间
2)给实例变量初始化
3)返回空间首地址
申请空间在内存的哪个区:
new的时候申请的空间在空间的堆区
如果实例变量是基本类型,此时初始化为0.
如果是字符串类型,则初始化为null
实例变量又保存在什么地方
堆区
p(指针变量名)栈区
对象方法保存在代码区
为什么[p run]; 就可以调用方法了?如何调用的
首先找p对应的空间,然后找到_isa,再找到_isa所指向的代码空间,然后到该空间中找方法
15)类方法:
类方法调用不需要实例
类方法的调用 [类名称 类方法名称]
类方法名称和对象方法名称可以相同
类方法的好处是不需要创建对象,直接通过类名进行访问,不需要在堆区创建任何空间
类方法中不允许访问实例变量,可以传个参数
实例方法可以访问实例变量
对象方法可以调用对象的其它方法
在类方法中可以调用类的其它方法,可以用self,也可以使用其它类名调用方法方法
在类方法中也可以调用对象方法,只不过是通过参数把对象传过来或创建一个对象
类方法不能调用自身(死循环)
[[Car alloc] init] 等同于[Car new]
匿名类作为方法参数使用:
Person *p = [[Person alloc] init]
[p gohome:[Car new]];
16)封装:
实例变量只能被当前类的对象方法访问
set方法的书写规范:
1)set方法一定是一个对象方法
2)set方法一定不能有返回值
3)set方法必须以set开头
4)set之后跟的是实例变量去掉下划线,并且首字母大写
5)set方法一定有参数,而且参数类型和实例变量的类型一致
6)oc中没有方法重载,oc中方法不能同名
7)static 定义的变量只能在当前文件中使用
17)self:
self指调用当前方法的对象
self在当前类方法中指代当前类
Person *p = [Person new];
[p class]; //返回当前类
函数内部可以定义和全局变量同名的变量
如果同名,局部变量会暂时屏蔽全局变量的作用域(可以用self来区分)
18)继承:
基类的私有属性能被继承,但不能使用
oc中是单继承
调用对象方法先查找本类中是否有方法,否则查找父类
支持多层继承
变量默认修饰符是@protect
@private 只能在当前类的对象方法中使用
.m中定义的变量就是私有变量
没有在.h中声明的方法是私有方法
私有方法不能被子类继承
NSLog("%p", d); 打印对象地址
NSLog("%@", d); 打印类名+对象地址
以%@的格式打印对象d,此时调用对象的description方法,如果子类中没有重写description方法则调用父类的
[d class]; 获取Dog类
类方法不能访问实例变量
不要在description方法中使用%@和self会造成死循环