欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

4、OC —— 构造方法

程序员文章站 2024-01-14 22:47:22
...

1、回顾之前写的 Person 类的 set 和 get 方法

    Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject {
    int _age;        // 年龄
    int _height;     // 身高     
}

- (void)setAge:(int)age;
- (int)age;

- (void)setHeight:(int)height;
- (int)height;

@end


    Person.m

#import "Person.h"

@implementation Person

- (void)setAge:(int)age {
    _age = age;
}
- (int)age {
    return _age;
}

- (void)setHeight:(int)height {
    _height = height;
}
- (int)height {
    return _height;
}

@end

    

    main.m

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 调用了init构造方法,alloc是由类名直接调用,所以是静态方法,而init则是动态方法
        Person *person = [[Person alloc] init];
        
        person.age = 20;
        person.height = 150;
    }
    return 0;
}


2、现在我们自己来写一个构造方法,来实现初始化的时候 Person 类的两个私有变量可以被赋值

    Person.h

@interface Person : NSObject {
    int _age;        // 年龄
    int _height;     // 身高     
}

// ...

// 自己写的构造方法,是一个动态方法
- (id)initWithAge:(int)age andHeight:(int)height;

@end


    Person.m

@implementation Person

// ..

// 实现自己写的构造方法
- (id)initWithAge:(int)age andHeight:(int)height {
    // 跟 java 一样先从父类那初始化
    self = [super init];
    
    // 如果初始化成功不为空
    if (self != nil) {
        _age = age;    // 或者 self.age = age;
        _no  = no;     // 或者 self.no  = no;
    }
    
    // 上面的代码可简写成以下,先赋值,再判断是否为空
    // if (self = [super init]) {
    //     ...
    // }
    
    // 最后要返回一个已初始化的对象
    return self;
}

@end


    main.m

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // Person *person = [[Person alloc] init];
        // person.age = 20;
        // person.height = 150;
        
        Person *person = [[Person alloc] initWithAge:20 andHeight:150];
        
        NSLog("age=%i,height=%i", person.age, person.height);
    }
    return 0;
}


3、 %@代表打印一个对象

    main.m 

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        
        NSLog(@"%@", person);    // 输出:person的地址
    }
    return 0;
}

    

    可以重写类自带的description方法来打印输出,因为它默认就是输出类的地址

    Person.m

@implementation Person

// ..

// 重写description方法
- (NSString *)description {
    return @"This is Person Class";
}

@end


    这时再使用 NSLog 输出这个类就会输出以上的字符串了。


4、补充

    a)self 在动态方法中代表调用这个方法的对象(谁调用这方法,谁就是self);在静态方法中它代表这个类;

    b)写在 .h 文件中的变量默认是 @protected,即可以自己和子类访问,若想设置为 @public @private 可这样设置

@interface Person : NSObject {
    int _age; 
    
    @public
    int _height;
    
    @private
    int _width;
}

@end

    c)没写在 .h 文件中的方法属于私有方法,写了的则为公有方法;


转载于:https://my.oschina.net/cobish/blog/339263