1.成员变量修饰符
实例变量既可以在interface 也可以在@implementation 中定义
写在@implementation 中的成员变量默认就是私有成员变量并且和@private 修饰不同 在@implementation 中定义的成员变量不外漏,别的类中既无法查看也无法访问
2.@property
在Xcode 4.4 之前 @property 自动生成 setter getter 的声明
在4.4之后 @property 自动实现属性的声明和实现 并自动赋值给该属性X对应的成员变量_X
其中_X 变量是私有变量
若同时重写@property 声明属性X的setter 和 getter 方法 则不会帮你自动生成相对应的_X成员变量
3.@synthesize
在Xcode 4.4 之前 @synthesize 自动生成 setter getter 的实现
--1.@synthesize 后告诉编译器,需要实现那个@property生成的声明和实现
既在编译阶段实现setter 和 getter 方法
--2.@synthesize 需要紧挨个传入的属性 赋值给哪个成员变量和返回哪个成员变量告诉调用者
--3.若是@synthesize 后面没有告诉系统将传入的只值赋值给那个成员变量,系统会扣人赋值给和@synthesize 后面声明的属性名称相同的成员变量
--4.@synthesize 后面声明 没有声明属性的赋值成员变量时,该属性会默认赋值给和自己属性名称相同的成员变量 (@property 不同),该成员变量可以未被声明
4.@property 修饰符号
@property(xxx) int age;
--1.readonly 只生成get方法没有set方法
--2.readwrite 默认属性,生成get 和 set方法
--3.getter = fooFuncName 重新声明getter方法
--4 setter =fooFuncName 重新声明setter方法 同 getter 方法同理
5. 动态数据类型id
id 为动态数据类型
--1.静态类型和动态类型
静态类型:
将一个指针变量定义为特定类的对象时,使用的是静态类型,在编译的时候就知道这个指针变量所属的类,这个变量是储存特定类的对象
Person *p = [Person new];
动态类型:
知道执行时才能确定对象所属的类
id obj = [Person new];
id 相当于NSObject * 为一个万能指针 因为所有的类都继承于NSObject
通过动态数据类型定义的变量,可以调用子类特有的方法
通过动态数据类型定义的变量,可以调用私有方法
弊端:由于动态数据类型可以调用到任意方法,所以有可能调用到不属于自己的方法(父类调用子类方法),而编译时又不会报错,导致运行时错误
为了避免动态数据类型引发的运行时错误 一般调用前会进行判断