GeekBand Objective-C 函数成员:方法、初始化

2016-05-14  本文已影响0人  东忙忙西茫茫

全局函数(C语言函数)

一般在头文件中定义,在实现文件中实现这个函数。可在任意位置去调用它。也可用OC的对象作为参数或返回值。

成员函数

1.实例方法(表达的是实例的行为)

1.1 定义:在接口头文件中定义方法,在实现类文件中去实现方法行为。

-(返回值)方法名:(参数类型)参数名;

// 接口头文件
-(void)sleep:(int)hour;
// 实现类文件
-(void)sleep:(int)hour{
    NSLog(@"%@ 休息 %d 小时",self.name, hour);
}
1.2.调用
Human* human = [[Human alloc] init];
[human sleep:3]; //[对象名 方法名]

方法内可访问的成员:实例成员(实例变量、属性、实例方法、类方法、静态变量)

2.类方法(表达的是类的行为)

+(返回值)方法名:(参数类型)参数名 对外参数名:(参数类型)参数名;

+(bool)marryToA:(Human *)a ToB:(Human *)b;
2.1.调用
[Human marryToA:tim ToB:jane]; //[类名 方法名:参数 外部参数名:参数];

类方法内访问成员:类方法、静态变量
不可访问:实例成员(实例变量、方法、属性)

注意:

OC中的所有方法默认就是Public的,没有private或prodected方法,但是可以通过扩展的方法实现类似的功能。
动态消息分发:方法的调用是通过运行时动态消息分发实现,在对象上调用方法又称“向对象发送消息”。

3.方法参数

如果参数类型是值类型,则为传值方式,如果参数类型为引用类型 则为传指针方式。
方法可以有参数,也可以没有参数。
如果方法有参数,方法名约定包含第一个参数名,从第二个参数开始需要显示提供外部参数名。

+(bool)marryToA:(Human *)a ToB:(Human *)b;

在调用时,第一个参数名是忽略,但后面的参数名会显示。

[Human marryToA:tim ToB:jane];
注意:方法名 返回值 参数类型 等都相同,但外部参数名不同,属于不同的方法。

4.动态方法调用机制

id human = [[Human alloc] init];
        [human sleep:3];

通过id引用的对象在调用属性时不可以用.的方式,但可以用访问器方法。


7266335CA11D500430A242D7B31C39C9.png

支持运行时动态加入方法。详细了解 OC的运行时机制。

5.初始化器 init

初始化器方法可以重载多个,在我们实例化对象的时候,会调用init方法,系统默认为我们的类添加init方法,它将我们的实例变量初始化为0或nil。我们也可以自定义init方法来初始化类的变量值。

5.1.定义
// 接口头文件中
-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender;

-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender WithAge:(int)aAge;
// 实现类文件中
-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender{
    return [self initWithName:aName WithGender:aGender WithAge:0];
}

-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender WithAge:(int)aAge{
    self = [super init];
    if (self) {
        _name = aName;
        _gender = aGender;
        _age = aAge;
    }
    return self;
}
注意:在初始化器中,一定要调用父类初始化器方法获取到self对象(前置调用),并判断是否获取到对象。
5.2.使用
Human* human = [[Human alloc] initWithName:@"Jane" WithGender:@"woman" WithAge:23];

实例化对象的另一种方式:

Human* human = [Human new]; // 等同于 Human* human = [[Human alloc] init];  //init 无参数版本

6.类加载器 initialize

子类的加载器会调用父类的加载器,所以如果重写这个方法,需要判断当前self的类型。

6.1.定义
// 接口头文件中
+(void)initialize;
// 实现类文件中
+(void)initialize{
    
    if (self == [Human class]) {
        ...
    }
}

注意:类被加载时被系统自动调用,每个进程周期中只会被调用一次。相当于JAVA类中的静态代码块。

6.析构器 dealloc

析构器在类中只存在一个,用于释放对象拥有的动态资源,是实例方法。一般的对象由ARC自动释放,但对于一些不受ARC管理的动态内存,如malloc分配的内存,就需要在dealloc中手动释放了。另外还有非内存资源,如果文件句柄等。
子类的构造器会调用父类的构造器(后置调用)。

6.1.定义
// 接口头文件中
-(void)dealloc;
// 实现类文件中
-(void)dealloc{
    ...
    [super dealloc];
}
上一篇下一篇

猜你喜欢

热点阅读