iPhone开发技术2014_3

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

更多用法
// 布尔值 NSNumber *yesNumber = @YES; // 等价于 [NSNumber numberWithBool:YES] NSNumber *noNumber = @NO; // 等价于 [NSNumber numberWithBool:NO]
更多用法
// 空数组 NSArray * array = @[]; // 等价于 [NSArray array]
Protocol 协议
@protocol NSCopying -(id) copyWithZone: (NSZone*) zone; @end @interface Car: NSObject<NSCopying> { } @end //Car
Protocol 协议
与@interface相似, 但是没有实现 @protocol Foo - (void)doSomething; // 必须实现
– 参数和返回类型必须相同
覆写方法
向上映射(Upper Cast)
• 子类的实例总是可以赋值给父类对象的指针 • 子类对象总是可以替换父类对象 • 子类总是能够响应父类能够响应的消息
对象的初始化
• 我们已经知道怎样初始化一个对象 • 我们可以自定义对象初始化的过程
– 覆写init方法
注意init方法的返回值,过去返 回值的类型为id
– 首先,检查对象所属的类,查看是否定义了一 个具有指定名称的方法,有定义使用这个方法
– 如果没有定义,就检查他的父类,如果父类中 有定义,就使用这个方法 – 否则,继续向继承链上方查找
• 如果在某个基类中找到了,就是用该方法 • 如果一直到根类都没有找到,编译器警告
覆写方法
• 使用和父类相同的名称定义的方法
类静态变量与类初始化方法
• 类静态变量
– 在类定义中使用static定义变量 – 使用类静态方法封装存取器
• +initialize类静态方法初始化 类自身
– 每个类只发送一次
Category
分类的作用
1、分散类的实现 2、给现有类添加新的功能 3、不使用继承机制
枚举类型
• 使用枚举类型提高代码可读性
一个处理分数的程序
使用类进行重写
XCode4.2开始可以在实现部分添加 实例变量,实现私有的成员变量
类的声明
类的实现
对象的生存空间
创建了两个Fraction对象
关于属性的自动生成
可以省略
•使用@synthesis,编译器会自动生成同 名成员变量;也可以由用户手动指定成 员变量的名称。 •self->numerator •self->denominator
@optional - (int)getSomething; // 可选实现
@required - (NSArray *)getManySomethings:(int)howMany; // 必须实现 @end
Protocol 协议
@protocol UIScrollViewDelegate @optional - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate ... @end @interface UIScrollView : UIView @property (assign) id <UIScrollViewDelegate> delegate; @end @interface MyViewController : UIViewController <UIScrollViewDelegate> ... @end MyViewController *myVC = [[MyViewController alloc] init]; UIScrollView *scrollView = ...; scrollView.delegate = myViewController; // compiler won’t complain
使用对象来解决问题
• 面向对象编程的好处是什么? • 面向对象编程的原则
– – – – – – 1、开闭原则(Open Close Principle) 2、里氏代换原则(Liskov Substitution Principle) 3、依赖倒转原则(Dependence Inversion Principle) 4、接口隔离原则(Interface Segregation Principle) 5、迪米特法则(最少知道原则)(Demeter Principle) 6、合成复用原则(Composite Reuse Principle)
// 空的字典 NSDictionary * dict = @{}; // 等价于 [NSDictionary dictionary]
KVC
• Key-Value Coding:使用名称访问属性 • 写setValue:forKey:和读valueForKey:
– [a setProductName:@"Washing Machine"]; – [a setValue:@"Washing Machine" forKey:@"productName"];
对象字面量:Object Literals
旧的语法
NSNumber * number = [NSNumber numberWithInt:1]; NSArray * array = [NSArray arrayWithObjects:@"one", @"two", nil];
NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
– 定义一个枚举类型
– 使用枚举类型的变量
– 其他示例
Category 分类
@interface NSString (Translation) -(NSString*) toChinese; @end
Category 分类
@implement NSString (Translate) -(NSString*) toChinese { return ([GoogleTranslate translate:self]); }
• 遍历集合元素
字典中可以针对key或者value遍历 NSDictionary *myDictionary = ...; for (id key in myDictionary) { //这里可以对key进行操作 id value = [myDictionary objectForKey:key]; // 这里可以对value进行操作 }
对象字面量(XCode4.4+)
NSNumber * number = @1; NSArray * array = @[@"one", @"two"]; NSDictionary * dict = @{@"key1":@"value1", @"key2":@"value2"};
更多用法
// 整数 NSNumber *fortyTwo = @42; // 等价于 [NSNumber numberWithInt:42] NSNumber *fortyTwoUnsigned = @42U; // 等价于 [NSNumber numberWithUnsignedInt:42U] NSNumber *fortyTwoLong = @42L; // 等价于 [NSNumber numberWithLong:42L] NSNumber *fortyTwoLongLong = @42LL; // 等价于 [NSNumber numberWithLongLong:42LL]
iPhone应用开发技术 第三讲
浙江大学软件学院 移动互联网与游戏开发技术方向 2014年秋季
Objective-C基础
• Objective-C类的定义
– @interface -> .h文件 – @implmentation -> .m文件
• 对象的生成和初始化
– object = [Class alloc] – object =[object init] – object =[[Class alloc] init] – object =[Class new]
பைடு நூலகம்
• 面向对象编程的模式
– 创建型模式,共五种:
• 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
– 结构型模式,共七种:
• 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
– 行为型模式,共十一种:
• 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备 忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
集合操作
• 遍历集合元素 for-in (similar to Java)
NSArray *myArray = ...; for (NSString *string in myArray) { double value = [string doubleValue]; //如果这里string不是NSString对象,crash }
Objective-C基础
• Objective-C中类的方法
– [ ClassOrInstance method]; – [ receiver message ]; – [object setX: 5 andY: 6];
• 类的属性
– @property 和 @synthesis(可选) – p = [x age];和 p = x.age; – 属性也是方法 – 方法也是属性?
• 在 objective-C 中,每个类中都会自动生成 一个class 类型的 isa
Objective-C的动态特性
• isa 是什么,class 又是什么呢,找到 Class 的 定义我们会发现如下:
typedef struct objc_class *Class;
objc_class是什么
集合操作
• 遍历集合元素 for-in (similar to Java)
NSSet *mySet = ...; for (id obj in mySet) { if ([obj isKindOfClass:[NSString class]]) { //向NSString对象发送消息 } }
集合操作
KVC
• KVC只能存取对象,对于基本类型
– [a setVoltage:240];
– [a setValue:[NSNumber numberWithInt:240] forKey:@"voltage"];
• KVC能够直接访问实例变量
– 透过“对象封装”访问私有成员 – 为动态编程提供了可能
Objective-C的动态特性
指定初始化方法
• 如果一个类中有多个初始化方法,那么其 中一个应该是指定(designated)初始化方 法,并且其他所有初始化方法都应该使用 这个方法
• 通常指定初始化方法是最复杂的初始化方 法,一般是参数最多的方法
指定初始化方法
• 在Fraction类中定义指定初始化方法
• 其他初始化方法调用指定初始化方法实现 功能
•如果省略@synthesis,编译器自动生成 的成员变量名称前面会有下划线(_) •self->_numerator •self->_denominator
Objective-C中的继承
• 通过继承形成父类和子类的关系 • NSObject是所有类的根类
Objective-C中的继承
• 子类继承了父类的非私有实例变量和方法
– 可以直接访问,就像在子类中定义的那样
• 注意:只有在接口部分声明的实力变量才 能够被子类继承,在实现部分声明和合成 的实例变量是私有的,不能够被子类继承。
– 需要通过存取方法进行访问(封装)
一个继承的例子
子类中直接访问 父类的成员变量
一个继承的例子
继承链中的方法定位
• 向对象发送消息的过程
相关文档
最新文档