一、【掌握】点语法的介绍和使用
1.点语法是编译器特性,当编译器看到对象使用点语法,会自动把点语法转换为调用set或get方法的形式
2.使用
Student *s = [Student new];
s.age = @"daa";
Int age = s.age;
3.本质:就是set或者get方法
遇见s.age = 10;形式,就会自动展开为:[s setAge:10];
遇见int a = s.age;形式,就会自动展开为:int a = [s age];
4.注意事项
1)- (void)setAge:(int)age
{
Self.age = age;//死循环
}
2)- (int)age
{
Return self.age;
}
注意点:什么时候会生成set方法什么时候会生成get方法?
如果有赋值运算符,生成set方法,否则生成get方法。
二、【了解】@property关键字介绍和使用
用@property取 代set和get方法的声明
用@synthesize取代set和get方法的实现(会生成一个私有的成员变量)
@synthesize name
能够生成如下代码:
1.@synthesize生成的第一部分代码
{
NSString *name;
}
2.-(void)setName:(NSString *)name
{
Self->name = name;
}
-(NSString *)name
{
Return self->name;
}
//如果成员变量中已有name变量,则不会生成私有name变量,直接赋值
问题:想要给自己已有的带下划线的成员变量进行赋值,怎么办?
需要给@synthesize指定,告诉该赋值给谁。
@synthesize name = _name;
他就知道,赋值给_name;
三、【掌握】property的增强用法
@property的组合用法:
只要同种类型,就可以写在一起,用逗号分隔(建议一个成员变量写一行)
比如:
@property int age,height,weight;
@property NSString *name;
@synthesize的组合用法:
不区分数据类型,只要被@property修饰,就可以卸载一起,用逗号进行分隔
比如:
@synthesize age = _age,height = _height,weight =
_weight,name = _name;
@property的加强用法
同时-->
生成set和get方法的声明
生成set和get方法的实现
生成带下划线的成员变量
注意事项:
当用户手动重写了set方法时,@property会生成get方法和带下划线的成员变量
当用户手动重写了set和get方法时,@property不会生成带下划线的成员变量
当用户手动重写了get方法时,@property会生成set方法和带下划线的成员变量
三、【理解】id类型及应用场景
id出厂自带* id cat = [Cat new];
id万能指针,能够指向任何OC对象
NSObject:是所有类的父类,也就是基类。可以指向任何OC对象
区别:编译器对NSObject做类型检测,但是不对id做类型检测
用@property id obj;其中obj可以赋值任何OC对象,如:
s.obj = @"obj可以赋值任何OC对象";
四、动态类型检测
动态绑定
在objective-c中,一个对象内是否调用指定的方法不是由编译器决定而是由运行时决定,这被称作是方法的动态绑定。
在objective-c中,对象不是调用方法,而是接收消息,消息表达式为:
[reciver message];
运行时系统首先确定接受者的类型(动态类型识别),然后根据消息名在类的方法列表里选择相应的方法执行,所以在源代码里消息也称为选择器SEL。
消息函数的作用:
首先通过第一个参数的receiver,找到它的isa指针,然后在isa指向的Class对象中使用第二个参数SEL查找方法;
如果没有找到,就是用当前Class对象中的新的isa指针到上一级的父类的Class对象中查找;
当找到方法后,再一句receiver中的self指针找到当前的对象,调用当前对象的具体实现方法(IMP),然后传递参数,调用实现方法
假如一只找到NSObject的Class对象,也没有找到你调用的方法,就会报告不能识别,发送消息的错误
动态监测的方法
1)判断对象是不是指定类的对象或者指定类的子类对象
原型:-(BOOL)isisKindOfClass:(Class)aClass;
BOOL res = [son
isKindOfClass:dog];
2)判断对象是不是一个特定类型的对象,不包括子类
原型:-(BOOL)isisMemberOfClass:(Class)aClass;
BOOL res = [son
isMemberOfClass:dog];
3)判断一个类是不是另外一个类的子类
原型:+(BOOL)isSubclassOfClass:(Class)aClass;
4)判断对象中是否能影响指定的方法,这个最常用
原型:-(BOOL)respondsToSelector:(Class)aClass;
BOOL res = [son
respondsToSelector:s];
5)判断类中是否能响应指定方法
原型:+(BOOL)instancesRespondToSelector:(SEL)aSelector;
五、响应方法
Dog *d = [Dog new];
[d performSelector:@selector(run)];
//带一个参数的
[d performSelector:@selector(eat:)withObject:@"www"];
六、构造方法的概念
重点:自定义构造方法。
构造方法:用来初始化对象实例变量值
new一下,就能有一个对象
1.分配内存空间 +
alloc
2.初始化.
- init
构造方法:指的就是初始化方法
需求:创建10只狗,让这些狗在创建时,所有的年龄都是1岁.
可以通过重写init方法
- (instancetype)init
{
self = [super init];
if (self) {
//子类的初始化等等其他操作,都在这个花括号里面做
_age = 1;
}
return self;
}
Dog *d = [[Dog alloc] init];
说明;
1)init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,以减号开头。默认初始化完毕后,所有成员变量的值为0
2)alloc
向某个类发送alloc消息的结果
为该类分配内存,以存放该类的全部实例变量
还将这块内存区域全部初始化为0
注意:
一个刚刚分配的对象并不能立即使用
需要先初始化该对象,然后才能使用它
但由于未进行初始化,随后可能出现一些不可预测的行为
初始化成员变量
OC对象初始化为nil
C语言指针初始化为:NULL
基本数据类型初始化为:0
谁调用self所在的方法,self就指向谁,self就是谁
构造方法使用注意
子类拥有的成员变量包括自己的成员变量以从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化
原则:先初始化父类的,再初始化子类的
重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一定的固定的值。
注意点:
先调用父类的构造方法[super init];
在进行子类内部成员变量的初始化。
自定义构造方法
自定义构造方法的规范
一定是对象方法,以减号开头
返回值一般是id(instancetype)类型
方法名一定以initWith开头
//自定义构造方法
//命名的时候:init后边接了单词首字母必须大写
- (instancetype)initWithName:(NSString*)name andAge:(int)age;
//实现
- (instancetype)initWithName:(NSString*)name andAge:(int)age
{
//必须调回父类的构造方法
if(self = [super init])
{
_name = name;
_age = age;
}
return self;
}