OC基础第四章:@property和@synthesize

来源:互联网 发布:军事题材的网络电影 编辑:程序博客网 时间:2024/05/21 03:18

一、@property和@synthesize
@property (参数),下列是它的参数的详细:
原子性:atomic(对属性加锁,多线程下是安全的,默认值),nonatomic(对属性不加锁,线程不安全,但是相对于atomic速度快)
读写属性:readwrite (生成getter 和setter 默认值),readonly (只生成getter方法)
Set方法的处理:assign(直接赋值,默认,它可以在ARC下使用,但是它只适用于非OC对象) ,retain(先release原来的值,再retain新值) ,copy(先release原来的值,在copy新值 ,但是他可以在ARC下使用 )

在ARC下使用的是strong 和weak 。。。
@property特性:
1,@property只能写在@interface @end中。

2,@property 用来自动生成成员变量age的get/set方法声明(xcode4.4以前) 。

3,xcode4.4以后property做了增强 不但帮助我们自动生成get/set方法的声明还帮助我们自动生成get/set方法的实现 。

4,告诉编译器,要生成的get/set方法声明的成员变量类型是int 。

5,如果没有手动声明成员变量,perperty会在.m文件中自动帮我们生成一个—_age 开头的成员变量

@synthesize用法:
1. @synthesize age; 表示生成.h中变量age的get和set方法的实现

  1. @synthesize 给指定的实例变量赋值。
    @synthesize age = _age;

注意;
如果是@synthesize的话, 变量名要先在.h文件中声明。
@property,@synthesize这两个可以配合使用,用于简化set和get方法的定义和实现。

重写setter, getter方法:
只能重写setter, 或者getter方法中的一个
如果重写两个会报错.

二、OC特性—-动态类型
1)在objective-c中,一个对象内否调用指定的方法不是由编译器决定而是由运行时决定,
这被称作是方法的动态绑定。
2)在objective-c里,对象不调用方法,而是接收消息,消息 表达式为: [reciver message];运行 时系统首先确定接收者的类型(动态类型识别),然后根据消息名在类的方法列表里选择相依的方法 执行,所以在源代码里消息也称为选择器(selector)
3)消息函数的作用:
– 首先通过第一个参数的receiver,找到它的isa 指针,然 后在isa 指向的Class 对象中使用第 二个参数selector 查 找方法;
– 如果没有找到,就使用当前Class 对象中的新的isa 指针 到上一级的父类的Class 对象中查 找;
– 当找到方法后,再依据receiver 的中的self 指针找到当前 的对象,调用当前对象的具体实现 的方法(IMP),然后传 递参数,调用实现方法。
– 假如一直找到NSObject 的Class 对象,也没有找到你调 用的方法,就会报告不能识别发送消息 的错误。
1. 动态类型:
运行的时候确定的类型

  1. 动态绑定:
    动态绑定是基于动态类型的:
    基于动态类型,在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,这就是动态绑定。
    动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。

  2. 动态加载:
    动态创建类Class,动态添加Class成员变量与成员函数,动态变量赋值与取值,动态函数调用等;

  3. 内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面尤其的丰富。
    内省是对象揭示自己作为一个运行时对象的详细信息的一种能力。这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定

三、动态类型检测方法 (7种方法)
对象在运行时获取其类型的能力称为内省。内省可以有多种方法实现。
1、 判断类型
-(BOOL) isKindOfClass: classObj 判断实例对象是否是这个类或者这个类的子类的实
例。

2、判断实例对象是否是另一个类类型

-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例,不管是否是这个类 的子类的实例。

3、判断类是否是指定类的子类
+(BOOL) isSubclassOfClass:classObj 判断类是否是指定类的子类)

判断对象能否响应指定的方法
1、-(BOOL) respondsToSelector: selector 判读实例是否有这样方法
能响应run方法

2、+(BOOL) instancesRespondToSelector: 判断类是否有这个方法。此方法是类方法, 不能用在类的对象

1、响应方法
1、-(id) performSelector:selector(应用selector指定的方法)

2、-(id) performSelector:selector withObject:object(应用selector指定的方法,传递参数 object)

3、-(id) performSelector:selector withObject:object1 withObject:object2(应用selector指 定的方法,传递参数object1和object2)

0 0
原创粉丝点击