iOS开发笔记 - 语言篇之Objective-C

2016-11-17  本文已影响215人  jackfrued

类的设计

面向对象的基本概念

面向对象的三大支柱

定义和使用类

定义类的过程是一个抽象的过程,需要进行数据抽象和行为抽象,数据抽象是找到和对象相关的属性,行为抽象是找到和对象相关的方法。要完成数据抽象和行为抽象,通常可以从对问题的描述中找名词和动词,名词会成为类或者类中的属性,动词会成为类中的方法。

类的声明部分(.h文件)

#import <Foundation/Foundation.h>

@interface CDStudent : NSObject {
@private
    NSString *_name;
    NSUInteger _age;
}

- (instancetype) initWithName: (NSString *) name
                          age: (NSUInteger) age;

- (NSString *) name;

- (void) play: (NSString *) game;

- (BOOL) study: (NSString *) course
      forHours: (NSUInteger) hours;

@end

类的实现部分(.m文件)

#import "CDStudent.h"

const static int MIN_STUDY_HOURS = 120;

@implementation CDStudent

- (instancetype) initWithName: (NSString *) name
                          age: (NSUInteger) age {
    if (self = [super init]) {
        _name = name;
        _age = age;
    }
    return self;
}

- (NSString *) name {
    return _name;
}

- (void) play: (NSString *) game {
    NSLog(@"%@ is playing %@.", _name, game);
}

- (BOOL) study: (NSString *) course
      forHours: (NSUInteger) hours {
    NSLog(@"%@ is studying %@.", _name, course);
    return hours >= MIN_STUDY_HOURS;
}

@end

初始化方法

上面类的定义中,以init打头的方法称为初始化方法,初始化方法在创建对象时调用以完成对对象的初始化(给对象的属性赋初始值)

创建对象

CDStudent *stu = [[CDStudent alloc] initWithName:@"Alice" age:18];

给对象发消息

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

int main(int argc, char *argv[]) {
    @autoreleasepool {
        CDStudent *stu = [[CDStudent alloc] initWithName:@"Alice" age:18];
        [stu play:@"LoL"];
        BOOL hasFinished = [stu study:@"Objective-C" forHours:64];
        NSLog(@"%@ %@ mastered Objective-C.", [stu name], hasFinished ? @"has" : @"hasn't");
    }
    return 0;
}

使用访问修饰符

定义类时,可以给类中的属性添加访问修饰符,包括:

实例方法和类方法

定义类时,可以在方法的返回类型前添加-或+分别表示方法是实例方法或类方法。所谓实例方法就是对象的方法,即发给对象的消息,因此要创建对象才能调用;而类方法是类的方法,即发给类的消息,可以直接通过类名进行调用,不需要创建该类的对象。我们可以再添加一个类方法来创建学生对象,具体的代码如下所示。

+ (instancetype) studentWithName: (NSString *) name
                             age: (NSUInteger) age;
+ (instancetype) studentWithName: (NSString *) name
                             age: (NSUInteger) age {
    // 类方法中的self代表CDStudent类
    return [[self alloc] initWithName:name age:age];
}
// 直接给类发消息来创建和初始化学生对象
CDStudent *stu = [CDStudent studentWitWithName:@"Alice" age:18];

那么问题来了,哪些方法应该设计成实例方法,哪些方法应该设计成类方法呢?通常来说,一个方法与对象状态无关只跟类有关就要设计成类方法,反之就要设计成实例方法。


上一篇 下一篇

猜你喜欢

热点阅读