关于面向对象

看起来简单,好好体会其实有点深奥,初学的时候更感觉抽象,可能由于开发经验不足的关系吧,很难体会到面向对象的精髓。

放轻松,我们来用最直白得方式来探讨一下面向对象。

首先,编程是为了用计算机解决现实生活中的问题,或者模拟各种游戏情景提供娱乐。

面向过程编程是一种思维——知道做一件事的具体步骤,按流程一步一步的执行,致力于问题解决的具体实现步骤。

而我们今天要提起的面向对象也是一种思维方式——是一种模拟人类行为,思考的方式寻求最直接的途径解决问题。

为了说明这一点呢,我们一起来看看我们如何用面向过程和面向对象的方法分别解决开店的事件。

开店喽,用面向过程的方方法(典型中国人的方式:亲力亲为):租店铺,装修,买设备,顾员工,管理员工等。

但是呢,用面向过程的方法(外国人的方式):顾一个店长用来管理员工,店长再顾各种员工,中介来租房子,装修团队装修,采购员负责采购等。

看起来很杂乱的事情被分化得井井有条,哪里出问题直接找做这件事的人就可以。如果又需要一个管钱的,店长只需再请一个会计。分工明确,每分工作之间的关联很小。

面向对象的关键在于快速找到一个会解决问题的对象帮忙解决问题;

面向过程的关键在于遇到问题着关注解决问题的具体步骤。

看得出来用面向对象的方式用于编程,能使我们的程序方便维护,满足不断拓展的需求。

到此为止,我们应该已经了解到面向对象是一种模拟现实生活中对象间处理问题的简便的思维方式;并且用面向对象编程能使我们的程序更加健壮。

接下来我们来一起谈谈面向对象编程的一些相关术语:类,对象,实例变量,方法,消息

编程的过程:说白了就是模拟现实世界在计算机上模拟出一个虚拟的世界,大家很多都玩游戏也很享受那个虚拟的游戏世界,我不玩游戏,但是我本身也特别喜欢看这方面的电影。要模拟一个我们的虚拟世界,在这个世界中,我们就是创造者,我们会为人物分类,魔术师,剑士等。这些人物类别都有自己的生命特征,外形特征,最重要的是它们都有自己的技能。我们勾画了魔术师这一类人的全部共同特征,技能。到目前为止,魔术师只是一群具有共同特征的人物的统称,我们要用我们设计的这个魔术师的形象来创造出一个个魔术师,魔术师A,魔术师B,魔术师C。A,B,C才是一个个真正施展技能的角色,而魔术师只是一个统称,是我们的一个设计人物框架,在编程中我们用“类”表示;用这个“魔术师类“创建出来的A,B,C是我们编程当中的“对象”——一个个有独特特征,技能的实在角色。我们在魔术类中,描述了这个类应该具有的特征,技能,所以按照这个类创建出来的魔术师对象都具有这些特征,技能。这些特征我们称之为“实例变量”,技能我们称之为“方法”。某个具体的魔术师角色发动技能,我们称为“发送消息调用方法”。

勾画这个魔术师类的过程,我们称为类的设计封装。

那我们来设计一个。

魔术师(Magical)类:特征(身高,性别,生命值)技能(冰封,无中生有,天女散花)

接下来呢,我们就可以在XCode上创建这么一个类,步骤略。创建出来的Magical类有两个文件.h和.m文件。

.h是一个声明文件:实力变量的声明需要在{}中声明,方法的声明;如何实力变量声明,方法声明,步骤略。

.m是一个实现文件:对声明的方法的实现,方法有(+ \-)两种方法,+称为类方法,-方法称为实例方法(对象方法)。类方法类调用,对象方法对象调用;方法实现略。

有了类,我们需要用我们的魔术师类创建出3个魔术师对象A,B,C;

类比于生活中的按照草图建房子,我们需要圈地才能建房,然后为建起的毛坯房初始装饰一下,暂时住人;而在计算机中内存就是我们的地,我们要让计算机给我们分配空间来创建对象,为这个毛坯对象初始化一下。

alloc 对应内存分配以及为所有的实例变量赋系统默认值占据内存。接下来呢init初始化一下各个实力变量。

总之,[[Magical alloc]init];还有另一种方式[Magical new];new 封装了alloc和init方法;

关于初始化,这是一个必须详细说明的关键点。

我们班都是男生,我现在有一个学生类(有性别,名字),学生有性别这个实例变量,我要创建学生对象调用初始化init的时候,学生的性别还是系统默认的‘\0’,当然我们可以创建学生对象后一个个赋值男生;

但是如果我要是能在创建的同时都把性别初始化成男生,不就更省事儿了吗!

要实现这样的功能,我们就需要重写init方法,在init方法中把性别这个实例变量赋值为男生就可以了。

接下来呢 ,我们又考虑到名字怎么办呢,每个学生的名字是不用的如果用这种初始化设置默认值的形式,不就每个学生的名字都一样了吗,所以呢,为了解决这样一个问题,OC提供了便利初始化函数,供我们在初始化的时候传入独特的值。

又提供了便利构造器封装了便利初始化函数,更加方便快捷的调用。

便利构造函数和便利构造器都是初始化出独特的对象的方法。关于命名是有规范的,便利构造函数,实例方法命名要以initWith开头,便利构造器,类方法命名以类名开头(类名首字母小写);

总结:关于面向对象,我们着重于面向对象编程:即类的封装,对象的创建,以及实力变量的使用,方法的调用;

类的创建封装,是基础,也是面向对象的重点难点,在实际的开发过程中会凸显出来,而初学者反而困扰在方法的调用和运行的流程。

需要注意的细节:

初始化函数的命名规范;

困扰人的概念:类方法和实力方法的调用;

OC整理1的更多相关文章

  1. IOS开发-OC学习-常用功能代码片段整理

    IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...

  2. oc界面开发整理

    oc界面开发整理 ViewController.h from test82 #import <UIKit/UIKit.h> @interface ViewController : UIVi ...

  3. 我收录整理的优秀OC技术类文章

        自定义导航按钮UIBarButtonItem   关于导航栏的六个小技巧   ios开发的一些小技巧篇一 制作一个可以滑动操作的 Table View Cell - IOS - 伯乐在线 一个 ...

  4. OC调用Swift 整理步骤!总结别人的!方便自己查找!

    1. 2. 上面的修改了一个配置项,有一个Product Module Name在后面会使用. 在工程里面点击File/New/File…,选择iOS/Source/Cocoa Touch Class ...

  5. OC测试错误整理

    3. NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a value" forKey:@"aKey&q ...

  6. OC开发_整理笔记——友盟分享(社交化组件)

    0.友盟的地址 http://dev.umeng.com,进入友盟,在使用友盟之前我们需要注册账号获取key (1 进入我们的产品,添加新应用 (2  输入信息,然后就会获取到key 1.选择社会化分 ...

  7. OC开发_整理笔记——多线程之GCD

    一.进程和线程   二.各种队列! 1.GCD:Grand Central Dispatch 2.串行队列(Serial)      你可以创建任意个数的串行队列,每个队列依次执行添加的任务,一个队列 ...

  8. oc语言基础整理

    objc.h---------------- typedef struct objc_class *Class; struct objc_object { Class isa  OBJC_ISA_AV ...

  9. iOS 常用三方类库整理

    iOS 常用三方类库整理 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa 2:hud提示框 地址:https://gi ...

随机推荐

  1. C# List<T> 合并、去重、查找

    List<,,,,,}; List<,,,,}; listA.AddRange(listB );//把集合A.B合并 List<int> Result = listA.Unio ...

  2. 如何编写稳定流畅的iOS移动端应用

    原文链接:http://www.jianshu.com/p/f4adce56166f 不忘初心 在过去几年间,移动应用以雷霆之势席卷全球.我们在工作和休闲时间中使用互联网的方式,已经随着移动应用的前进 ...

  3. centos7.0 下安装jdk1.8

    centos7.0这里安装jdk1.8采用yum安装方式,非常简单. 1.查看yum库中jdk的版本 [root@localhost ~]# yum search java|grep jdk 2.选择 ...

  4. System系统类常用方法

    System 系统类: 主要用于获取系统的属性数据. System类常用的方法: arraycopy(Object src, int srcPos, Object dest, int destPos, ...

  5. C#做上位机软件——绘图并传输给下位机

    拿到任务之后首先分成了几个部分: 1.绘图.学习了GDI+ 2.图片保存. 3.将图片转换成byte[].由于使用Socket通信,只能传输byte[]数据,所以这一步是向下位机传输的关键. 相应地, ...

  6. 51nod1174(RMQ)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1174 题意:中文题诶- 思路:RMQ模板题 关于RMQ: h ...

  7. JSON resource 启示

    好久没写博客了,刚走完20000步,不废话了,先吐为快. 上面的en-us.json 是一个简单得不能再简单的json对象,当你写下"key-2": "duplicate ...

  8. POCO库——Foundation组件之缓存Cache

    缓存Cache:内部提供多种缓存Cache机制,并对不同机制的管理缓存策略不同实现: ValidArgs.h :ValidArgs有效键参数类,模板参数实现,_key:键,_isValid:是否有效, ...

  9. MySQL和Lucene索引对比分析

    MySQL和Lucene都可以对数据构建索引并通过索引查询数据,一个是关系型数据库,一个是构建搜索引擎(Solr.ElasticSearch)的核心类库.两者的索引(index)有什么区别呢?以前写过 ...

  10. Js(DOM) 和Jq 对象的相互转换

    JQuery 对象不能使用DOM对象中的方法,同样,Dom对象 不能使用JQuery 中的方法,但有时候 ,我们不得不使用JQuery的方法或者 Dom对象的方法,该怎么办呢? 下面介绍一下 jq对象 ...