分享

Objective-C基础教程 学习笔记(十)

 quasiceo 2015-04-03

Objective-C基础教程 学习笔记(十)

文件加载与保存
Cocoa提供了两个通用的文件处理类:属性列表和对象编码。

1. 属性列表
在 Cocoa中,有一类名为属性列表的对象,常简写为 plist。这些列表包含 Cocoa知道如何操作的一组对象。具体来讲,Cocoa知道如何将它们保存到文件中并进行加载。属性列表类包括NSArray、NSDictionary、NSString、NSNumber、NSDate和NSData,以及它们的变体(如果存在变体的话)。

1.1 NSDate
NSDate是Cocoa中用于处理日期和时间的基础类。可以使用[NSDate date]获取当前的日期和时间,它是一个自动释放的对象。因此,以下代码:

1NSDate *date = [NSDate date];
2NSLog(@"Today is %@", date);

将输出如下结果:

1Today is 2013-07-11 09:53:06 +0800

你可以使用一些方法比较两个日期,从而对列表进行排序。还可以获取与当前时间相隔一定时差的日期。例如,你可能需要24小时之前的确切日期:

1NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow: -(24 * 60 * 60)];
2NSLog(@"Yesterday is %@", yesterday);

+dateWithTimeIntervalSinceNow: 接受一个NSTimeInterval参数,该参数是一个双精度值,表示以秒为单位的时间间隔。通过该参数可以指定时间偏移的方式:对于将来的时间,使用正的时间间隔。对于过去的时间,使用负的时间间隔。
继续阅读Objective-C基础教程 学习笔记(十)

Objective-C基础教程 学习笔记(八)

类别
在编写面向对象的程序时,经常希望向现有的类添加一些新的行为:总是能够为对象提供使用这些新方法的新手段。例如,你设计了一种新轮胎,因此应该创建 Tire 类的子类并添加新的成员变量。当希望为现有的类增加新行为时,通常会创建子类。
但有时子类并不方便。例如,你可能会希望为 NSString 类增加一些新行为,但是 NSString 实际上只是一个类簇的前台表示,因而无法处理新类的对象。例如,当使用类方法 stringWithFormat 生成一个新的字符串时,新建的 NSString 类的子类无法返回。
利用 Objective-C 的动态运行时分配机制,可以为现有的类添加新方法。这些新方法的 Objective-C 术语称为“类别”(category)。

1. 创建类别
类别是一种为现有的类添加新方法的方式。你可以为任何类添加新的方法,包括那些没有源代码的类。
例如,一个纵横字谜游戏将接收一系列的字符串,程序确定每个字符串的长度并将这些字符串的长度存入 NSArray 数组或 NSDictionary字典中。你需要先将每个长度包装在一个NSNumber对象中,然后才能将其存入NSArray数组或NSDictionary字典中。此时,可以为 NSString 类添加一个类别,该类别可以完成上述过程。

1.1 声明类别
类别的声明格式与类的声明格式相似:

1@interface NSString (NumberConvenience)
2- (NSNumber *) lengthAsNumber;     
3@end

该声明具有两个特点。首先,现有的类位于 @interface 关键字之后,其后是位于圆括号中的一个新名称。该声明表示,类别的名称是 NumberConvenience,而且该类别将向 NSString 类中添加方法。换句话说:“我们正在向NSString类添加一个名称为 NumberConvenience的类别。”只要保证类别名称的唯一性,可以向一个类中添加任意多的类别。 其次,可以指定希望向其添加类别的类(上面为 NSString)以及类别的名称(上例为 NumberConvenience),而且还可以列出添加的方法,最后以 @end 结束。由于不能添加新的实现变量,因此与类的声明不同的是,类别的声明中没有实例变量部分。
继续阅读Objective-C基础教程 学习笔记(八)

Objective-C基础教程 学习笔记(七)

特性
在 Objective-C 2.0 中引入了特性(property),它组合了新的预编译指令和新的访问器语法。新的特性功能显著减少了必须编写的冗长代码的数量。

1. 修改特性值
1.1 简化接口
示例:

1@interface AllWeatherRadial : Tire {
2    float rainHandling;
3    float snowHandling;
4}
5 
6@property float rainHandling;
7@property float snowHandling;
8 
9@end // AllWeatherRadial

@property 是一种新的编译器功能,表示声明了一个新的对象的属性。 @property float rainHandling; 语句表明 AllWeatherRadial 类的对象具有 float 类型的属性,其名称为 rainHandling。而且可以通过调用 -setRainHandling: 来设置属性,通过调用 -rainHandling 来访问属性。@property 预编译指令的作用是自动声明属性的 setter 和 getter 方法。实际上,属性的名称不必和实例变量的名称相同,但大多数情况下它们是一样的。
继续阅读Objective-C基础教程 学习笔记(七)

Objective-C基础教程 学习笔记(六)

对象
前面已经接触了创建新对象的两种不同方法:第一种方法是[类名 new],第二种方法是[[类名 alloc] init]。这两种方法是等价的,不过通常的 Cocoa 惯例是使用 alloc 和 init,而不使用 new。一般情况下,Cocoa程序员只是在尚不具备足够的水平来熟练使用alloc和init方法时,才将new作为辅助方法使用。

1. 分配对象
分配(allocation) 是一个新对象诞生的过程。最美好的时刻,是从操作系统获得一块内存并将其指定为存放对象的实例变量的位置。向某个类发送alloc消息的结果就是为该类分配一块足够大的内存,以及放该类的全部实例变量。同时,alloc方法还顺便将这块内存区域全部初始化为0。所有的BOOL类型变量被初始化为NO,所有的int类型变量被初始化为0,所有的float类型变量被初始化为0.0,所有的指针被初始化化为nil。
一个刚刚分配的对象并不能立即使用,需要先初始化对象,然后才能使用它。

2. 初始化对象
与分配对应的操作是初始化。初始化(initialization)从操作系统取得一块内存,准备用于存储对象。init方法(即执行初始化操作的方法)几乎总是返回它们正在初始化的对象,应该像下面这样嵌套调用alloc和init方法:

1Car *car = [[Car alloc] init];

而不像这样:

1Car *car = [Car alloc];
2[car init];

这种嵌套调用技术非常重要,因为初始化方法返回的对象可能与分配的对象不同。虽然这种情况很奇怪,但是它的确会发生。
继续阅读Objective-C基础教程 学习笔记(六)

Objective-C基础教程 学习笔记(五)

内存管理

1. 对象生命周期
对象的生命周期包括诞生(通过alloc或new方法实现)、生存(接收消息和执行操作)、交友(借助方法的组合和参数)以及当它们的生命结束时最终死去(被释放)。当对象的生命周期结束时,它们的原材料(内存)将被回收以供新的对象使用。

1.1 引用计数
如何知道对象的使用寿命何时结束?Cocoa 采用了称为引用计数(reference counting)的即使,也可以叫作保留计数。每个对象有一个与之相关联的整数,称作它的引用计数器或保留计数器。当某段代码需要访问一个对象时,该代码将该对象的保留计数器值加1,表示“我要访问该对象”。当这段代码结束对象的访问时,将对象的保留计算器值减1,表示它不再访问该对象。当保留计算器值为0时,表示不再有代码访问该对象了,因此对象将被销毁,其占用的内存将被系统回收以便重用。
当使用alloc、new方法或者通过copy消息(生成接收对象的一个副本)创建一个对象时,对象的保留计数器值被设置为1.要增加对象的保留计数器值,可以给对象发送一条 retain 消息。要减少对象的保留计数器值,可以给对象发送一条 release 消息。
当一个对象因其保留计数器归0而即将被销毁时,Objective-C 自动向对象发送一条 dealloc 消息。你可以在自己的对象中重写 dealloc 方法,可以通过这种方法释放已经分配的全部相关资源。一定不要直接调用 dealloc方法,可以利用Objective-C在需要销毁对象时调用 dealloc 方法。要获得保留计数器的当前值,可以发送 retainCount 消息。下面是相关方法的签名:

1- (id) retain;
2- (void) release;
3- (unsigned) retainCount;

retain方法返回一个 id 类型的值。通过这种方式,可以嵌套执行带有其它消息发送参数的保留调用,增加对象的保留计数器值并要求对象完成某种操作。例如[[car retain] setTire: tire atIndex: 2]; 表示要求 car 对象将其保留计数器值加1并执行 setTire 操作。
继续阅读Objective-C基础教程 学习笔记(五)

Objective-C基础教程 学习笔记(四)

Foundation Kit入门

1. 一些有用的结构体数据
1.1 范围的作用
第一个结构体 NSRange:

1typedef struct _NSRange {
2    unsigned int location;
3    unsigned int length;
4} NSRange;

这个结构体用来表示相关事物的范围,通常是字符串里的字符范围或者数组里的元素范围。location字段存放该范围的起始位置,而 length 字段则是该范围内所含元素的个数。如在字符串“Objective-C is a cool language”中,单词“cool”可以用location为17,length为4的范围来表示。也许由于location字段未被初始化,所以它的值可以是 NSNotFound,用来表示无意义范围。
可以用3种方式创建新的 NSRange。
继续阅读Objective-C基础教程 学习笔记(四)

Objective-C基础教程 学习笔记(三)

OOP 类之继承与复合

1. 只能继承一个
某些语言(如 C++)具有多继承特性,在这种情况下,一个类可以直接从两个或多个类继承而来。但 Objective-C 不支持多继承,如果使用了多继承,则编译器无法正确识别。多继承的示例如下(实际上在 Objective-C 语法中是错误的):

1@interface Circle : NSObject, PrintableObject

实际上,可以通过 Objective-C 的其它特性来获取多继承的有点,如分类和协议。

2. 一些术语
超类(superclass) 是所继承的类。Circle的超类是 Shape,Shape的超类是 NSObject。
父类(parentclass)是超类的另一种表达方式。
子类(subclass)是实施继承的类。Circle是Shape的子类。
孩子类(childclass)是子类的另一种表达方式。
改变方法的实现时,需要重写(override)继承方法。
继续阅读Objective-C基础教程 学习笔记(三)

Objective-C基础教程 学习笔记(二)

这一部分主要学习 Objective-C中的OOP

1. @interface 部分
创建某个特定类的对象之前,Objective-C编译器需要一些有关该类的信息。特别地,它必须知道对象的数据成员(即对象的 C struct 应该是什么样子)和它提供的特性。可以使用 @interface 指令把这种信息传递给编译器。

以下是 Circle 类的接口:

1@interface Circle : NSObject
2{
3    ShapeColor fillColor;
4    ShapeRect bounds;
5}
6 
7- (void) setFillColor: (ShapeColor) fillColor;
8 
9- (void) setBounds: (ShapeRect) bounds;
10 
11- (void) draw;
12 
13@end

接下来,将结合上述代码学习一些新的语法。
第一行代码为 @interface Circle : NSObject,在前面说过,在 Objective-C 中只要看到 @ 符号,就可以把它看成是 C 语言的扩展。 @interface Circle 告诉编译器:“这是为名为 Circle 的新类定义的接口。” NSObject 则告诉编译器,Circle类是基于 NSObject 类的。该语句表明每个 Circle 类都是一个 NSObject ,并且每个 Circle 都将继承 NSObject 类定义的所有行为。
继续阅读Objective-C基础教程 学习笔记(二)

Objective-C基础教程 学习笔记(一)

书籍英文原名:Learn Objective-C on the Mac
作者:Mark Dalrymple & Scott Knaster

1. #import 用来通知编译器应在头文件中查询定义,也可以用 #include,但 #import 可保证头文件只被包含一次。

2. 框架是一种聚集在一个单元的部件集合,包含头文件、库、图像、声音文件等。Apple 提供了 Cocoa、Carbon、QuickTime、OpenGL等技术框架。
Cocoa的组成部分有 Foundation 和 Application Kit (也成为 AppKit)框架。还有一个支持框架的套件,包含 Core Animation和Core Image.
Foundation框架处理的是用户界面之下的层中的特性,如数据结构和通信机制。
要成为 Cocoa权威专家,还必须精通AppKit,它包含用户界面元素、打印、颜色、声音管理等高级特性。

3. NSLog() 为 Cocoa函数,起作用类似与 C 语言中的 printf()。它接受一个字符串作为第一个参数,该字符串可包含格式说明符,如 %d。其它参数为匹配格式说明符的其它参数。
也可以用printf()来代替NSLog(),但不建议这样做。NSLog()添加了特性,如时间戳、日期戳和自动附加换行符等。

4. @符号是 Objective-C 在标准 C 语言基础上添加的特性之一。双引号中的字符串前有一个@符号,这表示引用的字符串应该作为 Cocoa 的 NSString 元素来处理。

5. NSString 就如同 C 语言的 String 一样,是 Cocoa 中的一串字符。钙元素有许多打包的特性,Cocoa 在需要字符串时可随时使用它们。
其部分功能如:告知其长度、将自身与其它字符串比较、将自身转换为整型值和浮点值。它还有许多功能是C风格字符串无法实现的。
值得注意的是不能将C风格的字符串传递给NSLog()函数,编译器会给出错误提示,在新版本的Xcode中已无法编译通过。
继续阅读

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多