------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
点特性
左侧stu.age=10;<=>[stu setAge:10];
int a=p.age;点语法出现在等号右侧将page替换为[p.age];
验证文件是否copy进
点击项目->BuildPhases->Compile Source
OC点语法本质为方法调用必须要有set get方法
@property编译器指令
告诉编译器声明属性的访问器(getter/setter)方法
@property 类型名 方法名(为get方法名)
写在声明@interface@end内
@property声明的实例变量为私有变量只在类中使用
@synthesize
在.m文件中定义set,get方法的实现
@synthesize age;
@synthsize name;与@property连用默认生成了两个变量,age,name
必须@property先声明
@synthesize age=_age,weight=_weight //将实例变量与属性关联不再使用默认生成变量
Xcode4.4以后可只使用@property自动生成下划线实例变量(私有变量)
编译时报错 不符合语法
运行时报错 代码区不存在
如果父类没有子类相同名的方法需要强制转换
NSObject *obj=[Animals new];
[(Animal *)obj run];
ios5后推出instancetype类型 与id类型不同点:
instance可返回和方法所在类型相同类型的对象 id只能返回未知类型对象
相同点就是都能作为返回值
动态绑定
在OC中 对象能否调用指定的方法 不是由编译器决定而是由运行时决定的
被称作方法的动态绑定
在OC中对象不调用方法而是接受消息 源代码中消息也称为选择器
消息表达式为[reciver message]
首先通过第一个参数reciver找到它的_isa指针,然后在_isa指向的class对象中使用第二个参数selector查找方法
如果没有找到就用当前class对象中的新_isa指针到上一级的父类的class对象中查找
当找到方法后,再依据reciver的self指针找到当前对象调用当前对象的具体实现的方法(IMP)然后传递参数调用实现方法
若一直到NSObject的Class对象也没有,则会报错。
内省 对象在运行时获取其类型的能力
1.判断类型
-(Bool) isKindOfClass:classObj判断实例对象是否为这个类或其子类实例
Bool b= animal isKindOfClass:[Animal class];
-(Bool) isMemberOfClass:classObj 判断实例对象是否为这个类实例
-(Bool) isSubClassOfClass:classObj 判断实例对象是否为其子类实例
2.判断对象能否响应指定的方法
-(Bool)respondsToSelector:selector
SEL s1=@selector(run);
Bool b=[dog respondsToSelector:s1];
判断类有无此方法
-(Bool)instanceRespondToSelector:selector
[Dog instanceRespondToSelector:s1];
响应方法
1.通过performselector响应无参方法
SEL s1=@selector(run);
[ani performselector:s1]
2.通过performselector:withObject:响应有参方法
SEL s1=@selector(eat:);//因为有一个参数所以eat后有冒号
[ani performselector:s1withObject:@"香蕉"];
3.通过performselector:withObject:withObject:响应两个参数
[ani performselector:s1withObject:@"香蕉"withObject:@"苹果"];
构造方法
1.alloc分配空间 此时内存已经清零
2.init初始化
3.返回值为对象地址
init就是构造方法 是对象方法减号开头
@implementation Person
-(instancetype)init{
self=[super init];// 作用:防止文件类的初始化方法释放(release)掉self指向的空间并重新alloc了一块空间
[super init]可能失败表示父类初始化失败 super指代父类的对象
if(self)
{
-age=10;
}
return self;
}
自定义构造方法
1.一定为对象方法减号开头
2.返回值为instancetype类型
3.方法名为initWith开头