self使用方法
self用在对象方法中
self用在类方法中
self访问实例变量 self ->实例变量
谁调用当前方法 self就代表谁
self在类方法中使用,其指代的是当前类
self在对象方法中使用其指代的是调用当前方法的对象
注解:self使用总结
self 谁调用当前方法,self就代表谁
self 在对象方法中,self代表当前对象
self在类方法中,self代表类
self和super:
1. self理解: 谁调用当前方法, self就代表谁.
比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法
在类方法中, self代表的是类, 因为只有类名才可以调用类方法.
注意: 在对象方法中不要使用self调用类方法
在类方法中不要使用self调用对象方法
2. 获取当前对象的类: Person *p = [Person new];
[p class] = [Personclass] = Person
3. 在对象方法中可以通过 self->_speed访问成员变量.
4. super代表的是当前类的父类.
static关键字:
1. 在c语言中 static可以修饰局部变量、全局变量、函数
2. 在OC中, 不能用来修饰实例变量和方法, 但是可以修饰局部变量, 全局变量
继承
继承体系中方法调用的顺序:
1、在自己类中找
2、如果没有,去父类中找
3、如果父类中没有,就去父类的父类中
4、如果父类的父类也没有,就还往上找,直到找到基类(NSObject)
5、如果NSObject都没有就报错了
oc当中没有多继承 会用协议 分类来代替
实例变量修饰符 : 用来判断实例变量的作用域 ,限制实例变量的作用范围
@public 公有的 所有文件都可以正常的访问使用 前提是需要包含头文件
@private 私有的 只有当前类可以访问 不能被子类访问(子类尅继承所有的实例变量和方法 但是 不是所有的都可以访问)
@protected 作用于当前类和子类 都可以访问 不能在其他类中使用
@package 作用于框架 不经常用
在@interface和@end之间实例变量中如果没有作特别的说明 默认的是@protected
oc中的私有变量
@implementation 类名
{
数据类型+变量名
//这是一个私有的实例变量(全局的) 不能被子类继承 私有成员变量只有在当前文件中访问
}
oc中的私有方法(相对私有)
在.m文件中实现,不需要在.h文件中声明 不能被子类继承 只有在当前文件中访问 在当前文件中可以调用
多态
1. 多态概念,定义
什么是多态:多态就是某一类事物的多种形态;
表现形式: Animal *ani = [Dog new];
多态条件:1.有继承关系 2.有方法的重写
2.多态代码实现:
//实例化猫的对象
Animal *animal = [Cat new]; //父类的指针指向子类对象;
[animaleat];
//实例化狗的对象
animal = [Dog new]; //父类的指针指向子类对象。
[animal eat];
3.多态注意点:
1) 如果存在多态,父类是可以访问子类特有的方法
假设子类Dog 有一个特有的方法bark
Animal *an2 = [Dog new]; //编译时看等号左边,运行时看等号右边
[(Dog*)an2 bark]; //把父类的指针,强制类型转换
2) 如果不存在多态,父类是不可以访问子类特有的方法的
Animal*an3 = [Animal new];
[(Dog*)an3 bark]; //错误的,不能强制转换
不同的对象以自己的方式响应相同名称的方法成为多态
表现形式为:父类指针指向子类对象 Animal *ani = [Cat new];
条件:方法的重写(子类把父类的同名方法重写) 有继承关系
优点:简化编程接口
多态的注意点:编译的时候看左边的类型 运行的时候看右边
类对象:
类的本质其实也是一个对象(类对象)
类对象运行时一直存在
类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等
每一个对象都包含一个指向其类对象的isa指针
类对象的使用:
1)可以用来调用类方法 :
//获取类对象
Class c1 = [Personclass];
//使用类对象调用类方法
[c1 test]; //test是一个+号方法
创建实例对象 调用类方法
类对象的获取方法: 类对象属于class类型
1.通过实例对象来获取 2.通过类名来获取
Dog *d = [dog new];
Class c = [d Class]//通过实例对象来获取
Class c1= [Dog Class];
SEL
SEL是一种新的数据类型 和id,class一样
Person *p = [Person new];
SEL s1 = @selector(test);//test表示对象的方法 用SEL包装方法
[p performSelector:s1];
点语法:
传统setter getter方法
- (void)setAge:(int)age;
{
_age = age
}
- (int)age{
age
}
点语法:
本质上展开之后相当于调用setter,getter方法
P.age = 10; 等价于 [p setAge:10];
NSString*name = p.age; 等价于NSString *name = [p name]; // getter方法
对象. 成员变量 //展开之后到底是setter方法, 还是getter方法, 看在等号的左边还是右边,
如果是等号左边就是setter方法, 在等号右边是getter方法
点语法陷阱 :
在set方法使用self.
- (void)setAge:(int)newAge{
self.age = newAge;
}
点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。
切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。