天天看点

黑马程序员[email protected],@synthesize关键字及构造方法笔记

------<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

示例

黑马程序员[email protected],@synthesize关键字及构造方法笔记

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;

}

传递多个参数进行初始化以及初始化的顺序款图分析:

黑马程序员[email protected],@synthesize关键字及构造方法笔记

从图中可以看出,在构造方法的重写中,先进行父类的初始化再进行子类的初始化。