Objective-C 2.0 新特性一览 – 属性。

转载 2011年01月18日 23:19:00

属性是一种定义类所提供的数据的通常方法。在Movie这个类里,诸如“标题”,“工作室”和“发布年份”等等都算是属性。这里是用Objective-C 1.x语法定义的Movie类:    

@interface Movie : NSObject {
 
  NSString* title;
  NSString* studio;
  int yearReleased;
}
 
+ (id)movie;
 
- (NSString*)title;
- (void)setTitle:(NSString*)aValue;
- (NSString*)studio;
- (void)setStudio:(NSString*)aValue;
- (int)yearReleased;
- (void)setYearReleased:(int)aValue;
- (NSString*)summary;
 
@end

这里是它在Objective-C 2.0里面的样子:

@interface Movie : NSObject {
 
  NSString* title;
  NSString* studio;
  NSInteger yearReleased;
}
 
+ (id)movie;
 
@property (copy) NSString* title;
@property (copy) NSString* studio;
@property (assign) NSInteger yearReleased;
@property (readonly) NSString* summary;
 
@end

需要注意的是并不是所有的东西都是属性。假如有一个生成新object的类方法 +move,这一类的东西不需要被声明成属性。
属性的定义格式如下:
    
@property (<parameters>) <type> <name>;

经常备用到的参数是 copy/reain/assign。在其中选择一个来确定属性的setter如何处理这个属性。很多Objective-C中的object最好使用用retain,一些特别的object(例如:string)使用copy。

assign关键字代表setter直接赋值,而不是复制或者保留它。这种机制非常适合一些基本类型,比如NSInteger和CGFloat,或者你并不直接拥有的类型,比如delegates。

readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。我们把 summary 定义为 readonly 是因为它并不需要一个专门的类变量,相应的,我们会在用到的时候动态生成它:

@implementation Movie
 
+ (id)movie {
  return [[[Movie alloc] init] autorelease];
}
 
- (NSString*)title {
  return title;
}
 
- (void)setTitle:(NSString*)aValue {
  [title autorelease];
  title = [aValue copy];
}
 
- (NSString*)studio {
  return studio;
}
 
- (void)setStudio:(NSString*)aValue {
  [studio autorelease];
  studio = [aValue copy];
}
 
- (int)yearReleased {
  return yearReleased;
}
 
- (void)setYearReleased:(int)aValue {
  yearReleased = aValue;
}
 
- (NSString*)summary {
  NSNumber* yearAsObject;
  yearAsObject = [NSNumber numberWithInt:[self yearReleased]];
 
  return [NSString stringWithFormat:@"%@ by %@, released in %@",
    [self title], [self studio], yearAsObject];
}
 
@end

这里是 Objective-C 2.0 版本(启用了垃圾回收):

@implementation Movie
 
@synthesize title;
@synthesize studio;
@synthesize yearReleased;
 
+ (id)movie
{
  return [[Movie alloc] init];
}
 
- (NSString*)summary
{
  NSNumber* yearAsObject;
  yearAsObject = [NSNumber numberWithInteger:self.yearReleased];
 
  return [NSString stringWithFormat:@"%@ by %@. Released in %@.",
    self.title, self.studio, yearAsObject];
}
 
@end

@synthesize 指令生成了相应的访问方法,垃圾回收代表 +movie 不需要 autorelease它返回的object。还有,我们使用了self.title,self.studio替代了[self title]和[self studio]。

现在让我们从使用者的角度看看Movie类:



Movie* newMovie = [Movie movie];
newMovie.title = @"The Incredibles";
newMovie.studio = @"Pixar";
newMovie.yearReleased = 2004;
 
NSLog (@"Movie summary: %@", newMovie.summary);

运行结果:

Movie summary: The Incredibles, by Pixar. Released in 2004.

在Objective-C 2.0中你可以同时使用两种属性访问方式。”.”操作符并不是唯一的方法。你也可以使用”.”访问没有被明确定义的属性。例如:
    

NSString* newString = [textField stringValue];
NSString* newString = textField.stringValue;

@property和@synthesize的区别可能在一开始并不容易看出来。@property定义一个已经存在的属性,而@synthesize实现了具体的访问方法,如果需要的话。

注:当getter需要返回一个有效值的时候synthesize标记会被默认使用。如果启用了垃圾回收的话,这不会产生任何额外的开销。你可以使用 nonatomic 关键字来禁用这个行为。

Objective-C 2.0 新特性一览 - 属性

 Objective-C 2.0 新特性一览 - 属性 属性是一种定义类所提供的数据的通常方法。在Movie这个类里,诸如“标题”,“工作室”和“发布年份”等等都算是属性。这里是用Objective-...
  • ydfok
  • ydfok
  • 2008年07月31日 21:04
  • 1344

Apache Hive2.0的新特性介绍

Hive 是一个基于 Hadoop 文件系统之上的数据仓库架构。它为数据仓库的管理提供了许多功能:数据 ETL (抽取、转换和加载)工具、数据存储管理和大型数据集的查询和分析能力。同时 Hive 还定...
  • jiangshouzhuang
  • jiangshouzhuang
  • 2016年09月19日 21:23
  • 2042

Objective-C 2.0 新特性介绍

前言: Apple向来对产品未来方向很有感觉,它在GCC的源代码库中拥有自己的一个独立分支,这些分支多数是开源的,所以对应的GCC编译器是免费的,但Objective-C 2.0的运行库不是免费的。 ...
  • Don211
  • Don211
  • 2012年04月24日 17:31
  • 455

Objective-C 2.0 基础要点归纳

本文的阅读基本条件: 具备C/C++基础知识,了解面向对象特征 阅读过《Objective-C 2.0 程序设计(第二版)》、《Objective-C 程序设计 第6版》或相关基础OC书籍 知识要点...
  • gujinjin2008
  • gujinjin2008
  • 2015年07月18日 20:11
  • 1613

HTTP 2.0带来哪些新特性

增加二进制分帧HTTP协议从0.9版本开始不断增加增加新的功能特性,但长远来看都是向前兼容的(现在的版本支持以后的版本数据)。HTTP 2.0在应用层跟传送层之间增加了一个二进制分帧层,从而能够达到在...
  • sysuzhyupeng
  • sysuzhyupeng
  • 2017年02月22日 22:07
  • 2214

jquery2.0的新特性

jQuery 2.0如期发布,该版本不再支持IE 6/7/8浏览器,因此变的更轻更快,但仍然可以继续运行在JavaScript环境中,在兼容这些老版本浏览器时,由于自身原因,常会产生一些错误。但别担心...
  • caihongshijie6
  • caihongshijie6
  • 2013年04月19日 21:48
  • 4568

HBase2.0的可用性与一致性

HBase在2.0.0版本之后在可用性上进行了发展,具体原理如下图所示: 由上图可知,region将不再只保存在某一单独的regionserver上,而是选择其他的两个regio...
  • bryce123phy
  • bryce123phy
  • 2016年04月21日 17:18
  • 3665

C#2.0 有哪些新特性?

泛型 在我看来,泛型就是通过将数据类型参数化从而实现了代码的更为灵活的复用,泛型的出现使得C#能够使用同一段代码来操作多种数据类型。泛型无疑是C#2.0最重大的改进,它的出现赋予了C#代码更强的类型...
  • niuniuasb
  • niuniuasb
  • 2017年02月07日 11:33
  • 358

Objective-C运行时编程指南(Objective-C Runtime Programming Guide)

简介 Objective-C语言进可能将许多决策从编译和链接延缓到运行时。它尽可能的动态处理事务。这意味着Objective-C不仅需要编译器还需要执行编译代码的运行时系统。运行时系统充当Object...
  • iosswift
  • iosswift
  • 2014年12月29日 21:29
  • 5056

angular2.0新特性总结

1:$scope将从Angular 2.0中移除,取而代之的是ES6类。 2:双向数据绑定:因双向数据绑定在大型应用中带来的问题  Angular 2.0引入了无回路有向图的单向结构概念。 ...
  • u012125579
  • u012125579
  • 2015年07月31日 09:09
  • 1422
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C 2.0 新特性一览 – 属性。
举报原因:
原因补充:

(最多只允许输入30个字)