赞
踩
@inteface 类名: NSObject {
@public // 外部可以访问
NSString *_name;
int _age;
}
@end
栈 | 堆 | 代码段 |
---|---|---|
指针变量 | 对象(属性) isa 指针 | 类 |
isa
指针指向代码段的对象所属的类C语言
指针为NULL
,OC的类指针类型为nil
指针名->属性名;
[指针名 方法名];
isa
指针,指向他的父类,父类指向他的父类,最后指向元类- (void)test:(Dog *)dog;
- (Dog *)test:(Dog *)dog;
- (返回值类型)方法名;
self
直接调用当前类的其他的对象方法,但是可以在类方法创建对象并访问属性,// 声明
+ (返回值类型)方法名;
// 调用
[类名 类方法名]
self
是一个指针,在对象方法中self
指向当前对象,在类方法中指向当前类self
self
new
实际上是一个类方法,可以创建匿名对象@public
,方法名需要set/get
开头,首字母大写,去掉下划线NSObject
@interface 类名 :父亲类的名称
@end
A从B继承,A是子类,B是父类
A从B派生,A是派生类,B是基类
直接在类的实现中将方法重写
同一个行为,不同事物不同表现
子类可以替换父类的位置,并且程序并不受影响
// 里氏替换原则
Father *p = [Son new];
NSOject
类型指针可以存储任意OC
对象的地址OC
指针类型,这个数组可以存储子类和父类对象NSObject
指针类型,任意OC
对象都可以存储 NSObject *obj1 = [Person new];
// 强制转换数据类型
[(Person *)obj1 sayHi];
NSObject
类是Foundation
框架的类,这类有个类方法new
,这个方法是用来创建对象,方法的返回值是创建这个对象的指针,这个类有个属性叫做isa
指针
NSObject
类是所有OC
类的基类,根据LSP
NSObject
指针就可以指向任意OC
对象,所有NSObject
指针是一个万能指针
万能指针,可以指向任意的
OC
对象
id
是一个typedef
自定义类型,在定义的时候已经加了*
,所有声明不需要再加
id
指针不能用点语法
id
指针和NSObject
指针的相同点:万能指针,都可以执行任意的OC
对象id
指针和NSObject
指针的不同点:NOSject
指针调用对象方法,编译器会检查,而id
指针不会,故正常用id
指针/// 可被继承的创建自身类对象
+ (id)newself {
return [self new];
}
方法的返回值是
instancetype
,代表方法的返回值是当前这个类的对象
id
和instancetype
的区别:instancetype
只能做方法的返回值,不能在别的地方使用,id既可以声明指针变量,也可以作为参数和返回值super
关键字调用当前对象从父类继承过来的对象方法,也可以通过self
来调用@private // 私有的,只能在本类的方法实现中访问,子类继承属性但不能直接访问,但可以调用父类的方法
@protected // 受保护的,只能在本类和子类中的方法访问
@package // 可以在当前框架中访问
@public // 可以在任意地方访问
protected
@implementation {
属性 // 真正的私有属性,修饰符无效,外界不显示
}
方法不写声明只写实现,只能在本类中的其他方法调用,不能被外界调用
Person.h
中包含Book.h
,而Book.h
又包含Person.h
的时候,就会出现循环引用的问题,无限递归导致编译无法通过#import
引入对方的头文件,而是使用@class
类名;来标注这是一个类,在.m文件中再引入对方的头文件
#import
是将指定文件的内容拷贝到写指令的地方
@class
并不会拷贝任何内容,只是告诉编译器这个一个类
SEL
全称叫做selector
选择器
SEL
是一个数据类型,需要在内存中申请空间存储数据
SEL
是一个类,SEL
对象是用来存储一个方法
SEL
是一个typedef
类型,自定义时候已经加*
了,声明时不需要再加
创建一个SEL
对象 -> 将方法的信息存储在这个SEL
对象之中 -> 再将这个SEL
对象作为类对象的属性
// 获取SEL对象
SEL s1 = @selector(方法名);
// 发送SEL消息
[p1 performSelector:s1];
// 等价于
[p1 方法名]
OC
最重要的机制:消息机制SEL
消息// 检测是否有这个对象方法(常用)
-(BOOL)respondsToSelector:(SEL)aSelector;
// 检测是否有这个类方法
-(BOOL)instanceRespondToSelector:(SEL)aSelector;
// 判断对象是否为指定类的对象或者子类的对象
-(BOOL)isKindOfClass:(Class)aClass;
// 判断对象是否为指定类的对象,不包括子类对象
-(BOOL)isMemberOfClass:(Class)aClass;
// 判断类是否为指定类的子类
+(BOOL)isSubclassOfClass:(Class)aClass;
Person *p1 = [Person new];
BOOL b1 = [p1 respondsToSelector:@selector(length)];
BOOL b2 = [p1 isKindOfClass:[Person class]];
BOOL b3 = [p1 isMemberOfClass:[Person class]];
new
方法的内部是先调用alloc
方法,再调用init
方法alloc
方法是一个类方法,一个类调用这个方法 就创建那个类的对象,并把对象返回init
方法是一个对象方法,作用是初始化对象Person *p1 =[Person new];
// 等价于
Person *p1 = [[Person alloc] init];
init
方法是一个对象方法,作用是初始化对象
- (instancetype)init {
// 调用父类初始化
self = [super init];
// 检查初始化是否成功 if(self)也可以
if (self != nil) {
self.name = @"jack";
}
// 返回初始化的对象
return self;
}
initWith
开头的函数才能是构造函数
- (instancetype)initWithName:(NSString *)name andAge:(int)age {
if(self = [super init]) {
self.name = name;
self.age = age;
}
return self;
}
// 调用
Dog *d1 = [[Dog alloc] initWithName:@"huang" andAge:2];
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。