------<a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
1. @property
用在@inteface中
用来自动生成setter和getter的声明
用@property int age;就可以代替下面的两行
-(int)age; // getter
-(void)setAge:(int)age; // setter
示例
2. @synthesize
用在@implementation中
用来自动生成setter和getter的实现
用@synthesizeage = _age;就可以代替
-(int)age
{
return _age;
}
-(void)setAge:(int)age
{
_age = age;
}
Ø 示例
3. @synthesize的细节
@synthesizeage = _age;
setter和getter实现中会访问成员变量_age
如果成员变量_age不存在,就会自动生成一个@private的成员变量_age
@synthesizeage;
setter和getter实现中会访问成员变量age
如果成员变量age不存在,就会自动生成一个@private的成员变量age
手动实现
若手动实现了setter方法,编译器就只会自动生成getter方法
若手动实现了getter方法,编译器就只会自动生成setter方法
若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量
4. @property新特性
自从Xcode 4.x后,@property就独揽了@synthesize的功能。也就是说,@property可以同时生成setter和getter的声明和实现
默认情况下,setter和getter方法中的实现,会去访问下划线 _ 开头的成员变量
5 id简介
万能指针,能指向任何OC对象,相当于NSObject *
id类型的定义
typedef struct objc_object
{
Class isa;
} *id;
使用
// 注意:id后面不要加上*
id p = [Person new];
局限性
调用一个不存在的方法,编译器会马上报错
6 构造方法的对象创建原理
1>任何一个子类都拥有父类的所有成员,调用init方法是先初始化super的init方法然后再初始化自己的init 方法。isa 指针是谁调用就指向谁。
new的拆分两部曲 : 1、 分配内存(+alloc)2、初始化(-init)
Person *p1 = [Person alloc];
Person *p1 = [p1 init];
合成一句后:
Person *p = [[Person alloc] init];
2> init方法的重写
想在对象创建完毕后,成员变量马上就有一些默认的值
init方法的重写过程
- (id)init
{
if (self = [super init]) // 标准的写法
{
_age =10;
}
return self;
}
3> 自定义构造方法
构造方法的一些规范:1、返回值是id类型 2、方法名都以init开头
- (id)initWithAge:(int)age {
if(self = [super init]) {
_age = age;
}
returnself;
}
传递多个参数进行初始化以及初始化的顺序款图分析:
从图中可以看出,在构造方法的重写中,先进行父类的初始化再进行子类的初始化。