对象可变性的管理和创建使用值对象,

来源:互联网 发布:淘宝手机端流量怎么看 编辑:程序博客网 时间:2024/05/07 11:09

对象可变性的管理

可变对象是指在创建后,可以更改其状态的对象。您通常通过属性或存取方法进行更改。不可变对象是指在创建后,不可以更改其封装状态的对象。您从 Objective-C 框架的大多数类所创建的实例是可变的,还有少数是不可变的。不可变对象具有以下好处:
 不可变对象被使用时,其值不会意外更改。
 对于许多对象而言,如果不可变,可提高其应用性能。
在 Objective-C 框架中,不可变类的实例通常用来封装离散的或缓冲的一组值,如数组和字符串。这些类通常具有可变变体,其名称包含“Mutable”。例如,有 NSString 类(不
可变)和 NSMutableString 类。请注意,封装离散值的部分不可变对象(如 NSNumber 或NSDate)没有可变类变体。 当您期望以增量方式频繁地更改对象的内容时,应使用可变对象,而不使用不可变变体。如果从框架接收到一个对象,其类型被定为不可变对象,请遵循该返回类型;请勿尝试更改该对象。

创建和使用值对象

值对象是指封装了基本值(属于 C 数据类型)且提供与该值相关的服务的对象。值对象以对象形式表示标量类型。Foundation 框架向您提供了以下类(这些类产生对象,用于字符串、二进制数据、日期与时间、数字以及其他值):
 NSString 和 NSMutableString
 NSData 和 NSMutableData
 NSDate
 NSNumber
 NSValue
值对象在 Objective-C 编程中很重要。您会频繁遇到这些对象,作为应用程序调用的方法和函数的参数和返回值。通过传递值对象,同一框架的不同部分以至不同的框架都可交换数据。因为值对象表示标量值,您可以在集 (collections) 中使用它们,也可以在任何需要对象的地方使用它们。但是,对象值除这些共性和由此产生的必然性之外,它们在其封装的基本类型上还具有另一项优势:它们让您能采用简单但高效的方式,对封装的值执行某些操作。例如,NSString 类具有用于搜索和替换子字符串、将字符串写入文件或(首选)URL 以及构建文件系统路径的方法。
有时,使用基本类型(即类型为 int(整型)、float 等的值)更高效、更直接。这种情况的一个主要例子是计算数值。因此,NSNumber 和 NSValue 对象在框架方法中,较少用作参数和返回值。但是,许多框架声明了它们自己的数值数据类型,并将这些类型用于参数和返回值;例如 NSInteger 和 CGFloat。您应该在合适的地方使用框架定义的这些类型,因为它们有助于让您的代码不拘泥于底层平台。

使用值对象的基本知识

创建值对象的基本模式,是让您的代码或框架代码从基本类型的数据创建值对象(接着也许在一个方法参数中传递它)。在您的代码中,稍后会从该对象访问被封装的数据。NSNumber 类提供了此方法的最清晰示例:
int n = 5; // Value assigned to primitive type 
NSNumber *numberObject = [NSNumber numberWithInt:n]; // Value object created from primitive 
int y = [numberObject intValue]; // Encapsulated value obtained from value object

大多数“值”类同时声明初始化程序和类工厂方法来创建实例。某些类(特别是 NSString 和 NSData)还提供初始化程序和类工厂方法,来根据储存在本地或远程文件中的基本数据以及内存中的数据创建实例。这些类还提供补充方法,来将字符串和二进制数据写入文件或 URL 指定的位置。以下示例中的代码调用 initWithContentsOfURL: 方法,根据 URL 对象定位到的文件的内容,创建 NSData 对象;使用数据后,代码会将数据对象写回文件系统:

 NSURL *theURL = // Code that creates a file URL from a string path...
 NSData *theData = [[NSData alloc] initWithContentsOfURL:theURL];
 // use theData... 
[theData writeToURL:theURL atomically:YES];

除创建值对象和让您访问其封装值之外,大多数值类都提供用于简单操作(如对象比较)的方法。 

将值类的实例声明为属性时,应该使用 copy 选项。

0 0
原创粉丝点击