中山大学数据科学与计算机学院本科生实验报告
(2019年春季学期)
一、实验题目
IOS基础
二、实现内容
- 学习IOS基础
- 掌握objective-c的语法
- 了解ios部分设计模式
三、实验结果
Objective-C学习笔记
1.SmallTalk 式的消息传递模型
在java中,方法调用:
obj.method(argument);
OC中,方法调用:
[obj method:argument];
Objective-C 与其说调用对象的方法,不如说向对象传递消息更为精确。
2.布尔(BOOL)
Objective-C的 BOOL 具有 YES 和 NO 两个值。
3.字符串(NSString)
Objective-C 字符串由双引号包裹,并在引号前加一个@符号
NSString *name = @"HelloWorld";
4.类的定义与实现
方法前面的 +/- 代表函数的类型:加号(+)代表类方法(class method),不需要实例就可以调用,与 Java 的静态方法相似。减号(-)即是一般的实例方法(instance method)。
定义部分,定义类的名称、数据成员和方法。 以关键字 @interface 开始,@end 结束:
@interface MyClass : NSObject {
int memberVar1; // 实体变量
id memberVar2;
}
+ (return_type)class_method; // 类方法
- (return_type)instance_method1; // 实例方法
- (return_type)instance_method2:(int)p1;
- (return_type)instance_method3:(int)p1 andPar:(int)p2;
@end
实现部分,以关键字 @implementation 开始,@end 结束:
@implementation MyClass {
int memberVar3; // 私有实体变量
}
- (return_type)instance_method1 {
....
}
- (return_type)instance_method2:(int)p1 {
....
}
- (return_type)instance_method3:(int)p1 andPar:(int)p2 {
....
}
@end
5.创建对象
创建对象需通过 **alloc 和 init **两个消息。alloc 是分配内存,init 则是初始化对象。 init 与 alloc 都是定义在 NSObject 里的方法,父对象收到这两个信息并做出正确回应后,新对象才创建完毕。
MyObject *obj = [[MyObject alloc] init];
// 也可以写成
MyObject *obj = [MyObject new];
6.协议 (Protocol)
协议类似与 Java 语言中的接口。
协议的定义以 @protocol 开头,@end 结尾:
@Protocol SayHello
- (void)sayHello;
@end
协议中定义的方法分为必须实现的方法和可选实现的方法。协议中的方法默认必须实现,可选实现的方法以 @optional 为标识,必须实现的使用@required。
@protocol SomeProtocol
- (void)method1; // 必须实现
@optional
- (void)method2; // 可选实现
- (void)method3; // 可选实现
@end
7.分类(Category)
分类可以给一个已经存在的类增加方法,而不用去改它的源码。
8.属性
属性(property)是 Objective-C 的一项特性,用于封装对象中的数据。实例变量一般通过“存取方法”(access method)来访问。其中,“获取方法”(getter)用于读取变量值,而“设置方法”(setter)用于写入变量值。
- 属性对应内部变量实体
- 属性的get/set对应实体方法
@property(*) 括号中的属性内容:
- 原子性:atomic 和 nonatomic,默认为atomic。
- 读写权限:readwrite 和 readonly, 默认为 readwrite,同时生成setter和getter,所以本质上是由@synthesize来实现的。而 readonly 就是代表只生成 getter 方法。
- 指定方法名:使用getter=或setter=来指定方法名。
- 内存管理:assign,strong,weak,copy。
操作 | 点语法 | 使用消息表达式 |
---|---|---|
setter | obj.name = val; | [obj setName:val]; |
getter | val = obj.name; | val = [obj name]; |
9. 代码块(block)
block 对象是对函数的扩展。除了函数中的代码,block 还包含变量绑定。block 也被称为闭包(closure)。block 是以 “^” 开头为标识的。后面跟的一个括号标示 block 需要的参数列表。
10. MVC模式与MVVM模式对比
- MVC的思想:一句话描述就是Controller负责将Model的数据用View显示出来,换句话说就是在Controller里面把Model的数据赋值给View
- Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
- View(视图):是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
- Controller(控制器):是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVVM的诞生
- 而现在的手机App功能越来越复杂,数据结构也越来越复杂,所以数据解析也就没那么简单了。如果我们继续按照MVC的设计思路,将数据解析的部分放到了Controller里面,那么Controller就将变得相当臃肿。还有相当重要的一点:Controller被设计出来并不是处理数据解析的。Controller的作用 1、管理自己的生命周期;2、处理Controller之间的跳转;3、实现Controller容器。这里面根本没有“数据解析”这一项,所以显然,数据解析也不应该由Controller来完成。
- 专门为数据解析创建出了一个新的类:ViewModel
- 在
MVVM
中,view
和view controller
正式联系在一起,我们把它们视为一个组件 view
和view controller
都不能直接引用model
,而是引用视图模型(viewModel
viewModel
是一个放置用户输入验证逻辑,视图显示逻辑,发起网络请求和其他代码的地方- 使用
MVVM
会轻微的增加代码量,但总体上减少了代码的复杂性
四、实验思考及感想
第一周的IOS开发课难度有点大,首先是对Objective-C语言的不熟悉,再加上对苹果环境的不熟悉,让我上手比较慢。课上看到工程师敲代码的速度以及方法令人震撼,我得学多久才能到达那样的开发水平。为了更好的学习这门课程,我在课后也仔细了解学习了oc的语法,希望下次课上能更好地跟上老师的讲授。等到真正投身到实际工程中,或许会对ios开发更有感觉,继续努力吧!