我的Macbook什么时候到啊啊啊啊啊啊啊啊啊啊啊啊,没有Macbook连学习都成为了问题呜呜…

Objective的Hello World程序:

第二章 对C的扩展

注意需要保存成.m格式,该格式是OC的文件格式

其中,#import是Objective-C中的特定预编译指令,保证了所有的文件只被包含一次,相应的C语言中使用#ifdef的宏指令实现的

第一个Foundation表示的是框架名称,框架内的Foundation.h内部包含了Foundation中的所有的函数等,读取每个文件在XCode里面会采用预编译头文件来加快读取速度,当使用import来包含的时候会大大加快读取速度

NSLog是Cocoa的特性,包含NS前缀的都是Cocoa中的特性,在实际编程的时候不能使用NS前缀,因为可能与Cocoa中的重复,或者未来有可能会重复,该函数和C语言中的printf类似,都是采用printf的一个format格式,注意%s格式的话用的是char*类型

字符串前面带@表示这是一个NSSrting变量,自我感觉可以类比为C++中的string,可以将自身转换为整型或者浮点,另外有长度还有将自身与其他字符串比较等特性。

注意:当我们使用NSLog的时候,需要对所有的字符串都加上@,即所有的格式都需要是NSString,如果传入的是一个C语言的字符指针类型的话就会报一个error,XCode中可以通过设置成将警报作为错误来处理的方式来规范代码,在项目导航器(Project Navigator)然后选中TARGETS文字下的项目选项,然后找到Treat Warnings as Errors,将其值更改为Yes

另外Cocoa中的NSArray可以存放数组,NSDateFormatter可以方便用不同的方式来设置日期格式,NSThread可以提供多线程编程工具,NSSpeechSynthesizer可以帮助你听到语音

BOOL类型

OC中的BOOL类型可以简单的理解为一个unsigned char类型并且在头文件里面有宏定义#define YES 1 #define NO 0

所以这和C++里面的内容就不太一样了,我们判断两个数字是否相同就不能简单的使用return a-b;类似这样的代码,而要指定为YES NO,就是最好对BOOL类型进行直接的赋值,赋值为YES NO,不可以使用C语言中的赋值,即赋值为除了01别的值

要注意NSString本身也是一个指针,如下代码演示:

文件

文件读入读出和C语言类似,都是采用FILE*来输入输出

命令行参数和C语言类似,argv[1]代表输入的第一个参数…

在XCode中,设置命令行参数需要以下操作:Product -> Edit Scheme菜单中选择Arguments选项,然后点击Arguments Passed On Launch下的加号按钮,输入启动参数

日常吐槽:Macbook什么时候到啊

枚举

结构体推荐使用

类似这样的方法来赋值,注意要按照顺序

另外使用了enum过后可以直接使用switch case 语句,比如上面的enum定义就可以使用这样的switch case语句

第三章 面向对象编程的基础知识

面向对象编程

使用方括号

该语句代表我们向shape对象发送了一个draw消息,这个语句我们称之为发送消息

类的首字母要大写

消息是对象可以执行的操作,对象在接受消息后,将查询相应的类,以便找到正确的代码来运行。

在创建对象之前,我们需要定义接口,@interface表示告诉编译器一些有关于该类的信息

第一行表示告诉编译器这个类名字叫Circle,继承于Cocoa中的NSObject类。该语句表明每个Circle类都是一个NSObject类,并且每一个Circle类都会继承NSObject类定义的所有行为。

花括号中的内容是定义数据成员,参考C++

下面的代码类似于C语言中的函数原型,列出了名称,返回值类型等

其中短线后面的是返回类型,后面跟着的是函数名称,冒号后面的是参数,括号里面代表参数类型,外面代表数据成员

中缀符

OC中的方法名称和参数是合在一起的,

例如:

[circle setFillColor: kRedColor];

带两个参数的调用如下所示:

[textThing setStringValue: @”hello there” color: kBlueColor];

方法的真正实现需要位于@implementation中,编写如下所示:

注意:在这里甚至可以定义未在@interface中声明的代码,这部分代码被视为私有内容

此处参数名称注意与上面不一样,为了区分数据成员和参数,所以我们要将参数重新命名

另外,参数在传递的时候会将隐藏的self参数传递进去

创建对象的时候我们需要向相应的类发送new消息,类似于:[circle new];这个操作会返回一个可以使用的实例

例如以下main函数,用于创建圆形,矩形和椭圆形。

这里我们使用了消息请求来设置对象的值(即文中的setBounds和setFillColor)

开放/关闭原则

面向对象的开放/关闭原则:对扩展开放,而对修改关闭。在功能出现变化时,我们不必修改那些可正常运行的代码。

第四章 继承

继承

对于大量的重复代码和方法可以通过继承的方法来优化代码。否则我们在修改代码的时候可能要修改很多的代码,效率很低。
继承的目的是能将所有重复的内容合并在一处,还能在需要的地方拥有自定义的方法
声明新类的语法
注意:Objective-C不支持多继承,即一个类只能从一个类继承而来,如果需要多继承则需要使用OC的其他特性,如类别和协议
那么上面的代码可以更改为:

Shape类实现代码:

draw方法不定义,类似于C++中的虚函数类型,这个函数可以返回dummy
那么其他的派生类都只需要重写一遍draw函数即可,下面举Circle的例子

代码调用的过程中,如果当前类中无法找到该方法,就向父类去查找,直到找到为止
创建新类时,对象会首先从父类继承实例变量,然后根据自身添加自己的实例变量

super关键词

super关键词用于向父类发送信息,本意是调用父类的方法来实现一些功能,例如上面的例子中重写了setFillColor函数,此时需要调用父类函数将color的值传到父类中

第五章 复合

复合

复合在于将多个类通过一种方式组合起来,例如:

NSLog自定义

NSLog在处理到%@说明符的时候,会询问参数列表中相应的对象,也就是会发送description消息到这个对象,该对象的description会生成一个方法并返回
Car程序的过程中需要确认一下:现在的engine和tire仅仅只是指针,还没有为这些指针分配内存,我们在new的时候会让这个类自动调用init方法,使该对象进入可用状态,所以这里需要写init函数

init中的if语句的意思是先调用[super init]并且用这个返回的结果来初始化对象,这是为了防止父类在初始化过程中返回的对象和一开始创建的不一致
主函数实现如下:

存取

读取或改变某个对象属性的方法称为存取。添加一个新方法去改变Car对象中的engine对象变量,就是一个存取方法。因为它为对象中的变量赋值,所以这类存取方法被称为setter方法。getter方法是通过对象自身去访问对象属性
通俗的讲就是不通过直接访问其他对象中的变量来更改变量的状态和值等。而是采用一个方法来进行对象的值的修改等。另外setter和getter方法一般成对出现
注意:编写Cocoa的程序的时候请不要使用get前缀,但是可以使用set前缀,原因是因为get前缀一般都是将指针作为参数传入。另外,OC中所有的对象交互都是采用指针实现的
例如:

 


0 条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注