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

类的设计

面向对象的基本概念

  • 对象:在现实世界中对象是我们认识世界的基本单元,在面向对象程序设计中对象是接收消息的单元;每个对象都是独一无二的;对象都有属性和行为;对象都属于某个类。

  • 类:类是对一组具有共同属性和行为的对象的抽象,它是创建对象的蓝图和模板。

  • 消息:对象与对象之间存在着一定的联系,这种联系通过消息的传递来实现。面向对象世界中的所有操作都是通过向对象发送消息来实现,对象接收到消息后,会执行对应的行为。

面向对象的三大支柱

  • 封装:把一个事物包装起来,使外界不了解它的内部的具体情况。在面向对象的程序设计中,封装就是把相关的数据和代码结合成一个有机的整体,形成数据和操作代码的封装体,对外只提供一个可以控制的接口,内部大部分的实现细节对外隐蔽,达到对数据访问权的合理控制。封装使程序中各部分之间的相互联系达到最小,提高了程序的安全性,简化了程序代码的编写工作。

  • 继承:从已有的类创建新类的过程,提供继承信息的称为父类,得到继承信息的称为子类,子类和父类之间是IS-A关系,继承使得类与类之间形成一个层次结构。与此同时,继承也让变化中的系统具有了稳定性和延续性。

  • 多态:不同结构的对象可以以各自不同的方式响应同一个消息,或者说同一个消息可以根据发送消息的对象的不同而采用多种不同的操作行为,这是面向对象最精髓的部分。

定义和使用类

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

类的声明部分(.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;
}

使用访问修饰符

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

  • @private:私有,对外界来说是不可见的(不可访问)。
  • @protected:受保护,对子类公开对其他类相当于私有。
  • @public:公开,对外界来说是可见的(可以访问)。

实例方法和类方法

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

+ (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];

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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容