美文网首页
GeekBand Objective-C 函数成员:方法、初始化

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

作者: 东忙忙西茫茫 | 来源:发表于2016-05-14 23:59 被阅读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];
    }
    

    相关文章

      网友评论

          本文标题:GeekBand Objective-C 函数成员:方法、初始化

          本文链接:https://www.haomeiwen.com/subject/xncvrttx.html