Objective-C基础

毕业设计选择了“iOS文件加密系统开发”的题目,此前没有接触过iOS开发,但题目难度不高,且指导老师给了比较大的发挥余地,在开发过程中没有遇到太大的困难。在一年后的今天回顾一下项目,把学到的东西整理成文章。

本文介绍了Objective-C语言的基础语法和代码的编写风格。

Objective-C

Objective-C是一门开发Mac OS和iOS操作系统上的应用程序的基础语言,它是C语言的超集,提供了面向对象的能力和动态运行时。

  • C语言源程序可以不经修改直接通过Objective-C编译器进行编译,且支持代码混编。

  • 面向对象的语法为SmallTalk风格,其他非面向对象的语法和数据类型,与C语言完全相同。

SmallTalk消息传递风格

调用某个对象的一个方法在Objective-C中成为给对象发送一个消息,具体的写法如下:

[object method]; //发送消息method给对象object

方法调用

下面是带参数和返回值的类方法调用

[object methodWithInput: input]; //带参数的方法调用
output = [object methodWithOutput]; //带返回值的方法调用
output = [object methodWithInputAndOutput: input];

带多个参数时比较头疼,与C,C++,Java等采用的

返回类型 方法名(参数列表)

形式不同,Objective-C方法带多个参数时采用方法名和参数列表穿插的形式,也即,方法名可以分成几段,例如:

//定义方法
- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue {...}
//调用方法
[myObj setColorToRed: 1.0 Green: 0.8 Blue: 0.2];

消息嵌套

[NSString stringWithFormat:[prefs format]];

函数调用

不涉及面向对象时与C语言一致,例如:

//控制台输出
NSLog(@"log output: %@", str);

接口

Objective-C的类分为两个部分,接口(@interface)定义通常放在.h文件中,实现(@implementation)部分放在.m文件中。.h与.m一一对应,类似于C语言中的头文件和源文件的关系,而与Java中的概念不同。

区别在于:

  1. Objective-C中接口有且只有一个实现,而Java中可以对应0-N个;
  2. Objective-C中,接口可定义成员的属性,而Java不行。

Objective-C中的Protocol类似于Java中的Interface。

类方法和实例方法

类方法也即Java中的静态方法,无需实例化即可调用,用“+”前缀来表示;实例方法就是普通的类方法,用“-”前缀表示。

创建类对象

不带参数的构造方法

//创建一个可变数组对象
self.dirList = [[NSMutableArray alloc] init];

带参数的构造方法

//创建字符串并赋值
refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];

继承

继承写在@interface中,书写形式:

子类名 : 父类名

例如

@interface MyClass : NSObject
@end
  • Objective-C只允许单继承,只能有一个直接父类。

  • 子类可以重写父类的方法,且不需要重新声明,在Implementation中直接重新实现即可。但重新实现的方法必须与父类的方法原型相同,即拥有相同的返回值类型和参数列表。

  • 子类调用父类方法时用关键字“super”。

协议

协议(@protocol)类似于Java中的Interface,一个类可以实现多个协议。

  • 协议的定义使用@protocol关键字,同样以@end结尾。

  • 协议的实现写在@interface中,父类的右边,用尖括号包围。

@interface MyClass : NSObject <MyProtocol>
@end
  • @optional关键字标记可选择性实现的方法,@required标记必须实现的方法。

  • 协议常用于委托(Delegate)

分类和扩展

分类

分类(Category)用于给已经存在的类增加方法。通过分类可以将类的方法分散到多个文件和模块中去。
文件命名遵循“类名+分类名.h”和“类名+分类名.m”。

//MyClass+MyCategory.h
@interface MyClass (MyCategory)
//新增的方法声明
@end

//MyClass+MyCategory.m
@implementation MyClass (MyCategory)
//新增的方法实现
@end

分类中除了增加还可以重写已有的方法。

扩展

扩展(Extension)是分类的特殊情况,为类添加新的变量、方法、属性。书写方法是一对空的圆括号。

  • 扩展中可以定义实例变量,而分类中不行。

  • 扩展在编译时被加入类中,所以当扩展没有被实现时编译器会报错。分类在运行时加入。

发表评论

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