`
shappy1978
  • 浏览: 698485 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多

http://blog.codingmylife.com/?p=40

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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里面的样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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,这一类的东西不需要被声明成属性。
属性的定义格式如下:

1
@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 是因为它并不需要一个专门的类变量,相应的,我们会在用到的时候动态生成它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@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 版本(启用了垃圾回收):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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类:

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

运行结果:

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

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

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

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

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

分享到:
评论

相关推荐

    Objective-C2.0程序设计第二版中文版及代码

    1. **Objective-C基础**:Objective-C是在C语言基础上扩展的,添加了面向对象特性。它的基础包括类、对象、消息传递等概念。类定义了对象的属性和行为,对象则是类的实例。消息传递是Objective-C的核心,通过`...

    Objective-C 2.0 运行时系统编程指南

    7. **属性声明**:解释了如何声明和使用属性,特别是Objective-C 2.0中引入的新特性。 #### 运行时系统的版本和平台 Objective-C运行时系统有两个主要版本:早期版本和现行版本。 - **早期版本**:该版本主要用于...

    The Objective-C 2.0 Programming Language

    Objective-C 2.0是苹果公司在2005年发布的一个重要版本,其中引入了许多新特性来提高性能和简化编程过程。 #### 三、Objective-C 2.0的主要特性 ##### 3.1 类与对象 Objective-C 2.0支持传统的面向对象编程概念,...

    Objective-C 2.0编程语言(Apple Inc.)The Objective-C 2.0 Programming Language (Apple Inc.)

    这一版本包括了运行时性能的改进、新增了垃圾回收特性、以及更多语言级别的新特性,比如快速枚举(fast enumeration)和属性(properties)。 本书《Objective-C 2.0编程语言》是苹果公司官方发布的文档,其目的...

    Effective Objective-C 2.0

    这本书详细阐述了如何利用Objective-C 2.0的新特性和最佳实践来提高程序的效率和质量。以下是从书籍中提炼出的关键知识点。 1. Objective-C语言简介:Objective-C是一种通用的编程语言,其被广泛应用于苹果公司的...

    Objective-C2.0程序设计

    《Objective-C 2.0程序设计》是一本关于MacOSX系统和iPhone平台下标准程序设计语言Objective-C 2.0的权威参考书。Objective-C是一种面向对象的编程语言,基于C语言设计而成,广泛用于OSX以及多种支持gcc编译器的操作...

    Objective-C 2.0运行时系统编程指南

    例如,Objective-C 2.0 及其相关的新特性主要体现在实例变量的非脆弱性等方面。 - **和运行时系统的交互**:解释了Objective-C程序如何通过不同的方式与运行时系统进行通信,包括通过Objective-C源代码、通过`...

    Objective-C 2.0 程序设计(中文版)+英文原版

    Objective-C 2.0 是苹果公司开发的一种面向对象的编程语言,它是基于C语言的,同时引入了Smalltalk的关键概念,如消息传递和动态类型。这个语言主要用于开发iOS和macOS平台的应用程序。《Objective-C 2.0 程序设计》...

    Objective-C 2.0 Programming Language

    块是Objective-C 2.0 中引入的一种重要的新特性,它可以看作是一个自包含的代码段,类似于函数指针但功能更加强大。块的使用大大增强了程序的灵活性和性能。 ##### 7. 类簇 Objective-C 2.0 中的类簇技术使得多个类...

    Effective Objective-C 2.0.pdf

    这本书深入探讨了Objective-C编程语言的最佳实践和设计模式,尤其关注Objective-C 2.0的新特性和改进。以下是该书涵盖的一些关键知识点: 1. **协议与类别(Protocols & Categories)**: - 协议是一种定义方法...

    Effective Objective-C 2.0&Obj;-C高级编程

    9. **Objective-C 2.0新特性**: - 包括快速枚举、属性(properties)的改进、垃圾回收(GC)的移除和对ARC的支持等。 通过深入学习这些主题,开发者可以更好地理解和利用Objective-C的特性,编写出更高效、更健壮...

    objective-c 2.0程序设计源码

    Objective-C 2.0是一种强大的面向对象编程语言,主要用于苹果的iOS和macOS平台开发。它是C语言的一个超集,融入了Smalltalk的关键特性,如消息传递和动态类型。本篇将深入探讨Objective-C 2.0的核心概念,并基于提供...

    Objective-C 2.0程序设计

    ### Objective-C 2.0程序设计相关知识点 #### 一、Objective-C语言基础 - **类与对象**:Objective-C是一种面向对象的语言,其核心概念是类和对象。类定义了对象的行为和属性,对象则是类的一个实例。本书第一章至...

    OBJECTIVE-C 2.0程序设计

    OBJECTIVE-C 2.0程序设计,全网最清晰版本

    Objective-C2.0程序设计习题官方答案

    Objective-C2.0是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,融合了Smalltalk的动态特性,广泛应用于iOS和Mac OS X操作系统。本资料集中的"Objective-C2.0程序设计习题官方答案"显然是针对学习...

    Objective-C 2.0基础Objective-C 2.0 Essentials

    包含34章的详细信息,旨在提供为Mac OS X和iPhone开发提供熟练使用Objective-C程序员所需的一切。

Global site tag (gtag.js) - Google Analytics