`

【Objective-C】Property and Synthesize

阅读更多

原文地址:http://blog.eddie.com.tw/2010/12/08/property-and-synthesize/
原创作者:
高見龍(中国台湾)

 

上篇,因為在類別裡,instance variable(以下簡稱ivar)預設是protected的,也就是說只有該類別以及它的子類別才能存取它,如果要給外部使用的話,則需要來幫它加個setter/getter。但每次只為了一個ivar就要寫一對的setter/getter也太麻煩了,在Objective-C 2.0之後加入了@property@synthesize的語法,讓這個工作簡單多了。借用上一篇的例子:

1
2
3
4
5
6
7
8
9
10
@interface Book : NSObject
{
  int price;
}

-(int) price;
-(void) setPrice: (int) p;
+(void) printBookInfo

@end

如果改用@property來寫:

1
2
3
4
5
6
7
8
9
@interface Book : NSObject
{
  int price;
}

@property int price;
+(void) printBookInfo;

@end

原來的setter/getter就可以省下來不用寫,然後在@implementation的部份則是使用@synthesize語法:

1
2
3
4
5
6
7
8
9
10
@implementation Book
// 這個@synthesize語法幫忙產生setter/getter
@synthesize price;

+(void) printBookInfo
{
  NSLog(@"Hello, This is a book");
}

@end

這裡的@synthesize price,其實就相當於自動產生了我們在上一篇寫的那一對setter/getter的程式碼:

1
2
3
4
5
6
7
8
9
-(int) price
{
  return price;
}

-(void) setPrice: (int) value
{
  price = value;
}

這樣程式碼就簡潔許多了。雖然@synthesize會自動幫忙產生setter/getter,但如果你想要寫自己的setter/getter,或是想要額外添加功能在裡面,只要照著它預設生成的setter/getter方法命名規則就可以了:

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
// interface
@interface Book : NSObject
{
  int price;
}

@property int price;
+(void) printBookInfo;

@end

// implementation
@implementation Book

@synthesize price;

// 自定setter
-(void)setPrice:(int)p
{
  // 故意讓傳入值變2倍
  price = p * 2;
}

+(void)printBookInfo
{
  NSLog(@"Hello, This is a book");
}
@end

@synthesize雖然會自動幫你建立一對setter/getter,但還是會以你建立的為主。

另外,記得在別的程式語言裡可以用點”.”來存取物件的屬性嗎? Objective-C 2.0之後也可以這樣做了,直接看看語法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Book *b = [[Book alloc] init];

// 一般的setter用法
[b setPrice:300];

// 一般的getter用法
NSLog(@"the price of the book is %d", [b price]);

// Objective-C 2.0之後可使用點語法,它會自動呼叫setter並將值傳給它
b.price = 200;

// 這裡則是呼叫getter把值傳回來
NSLog(@"the price of the book is %d", b.price);

[b release];

這樣有比較習慣了嗎? 我相信很多人對Objective-C的方括號的語法很感冒,至於程式碼的可讀性就看個人了,方括號語法看久了也是滿習慣的。不過用點語法的時候要注意幾件事,例如你自己寫了一個setter,又在裡面用了點語法:

1
2
3
4
5
-(void) setPrice: (int) p
{
  // 如果這樣寫的話,會啟動setPrice這個method
  self.price = p;
}

然後..就變無窮迴圈了! 這點要特別注意一下。

還有個問題是其實這個點語法光從程式碼其實看不太出來到底是物件還是結構還是變數..再來看另一個例子:

1
2
3
CGPoint pos = player.position;
pos.x += acceleration.x * 10;
player.position = pos;

這是一段Cocos2D的語法,內容大意是說:「我要建立一個CGPoint變數叫做pos,而這個pos是由player這個CCSprite的position來的」。acceleration是一個UIAcceleration物件,取得acceleration的x的值,修改pos裡的x之後再把整個pos變數塞回去給player這個角色。

這段程式碼對老手來說大概會覺得很弱,覺得這大概是新手,還得要建一個暫存變數,遜! 要是他來寫根本就可以直接併成一行:

1
player.position.x += acceleration.x * 10;

但事實上這樣寫的話會丟出一個”lvalue required as left operand of assignment”的編譯錯誤。為什麼會這樣? 分段來看:

1
player.position.x

其實這種”點語法”是一種”語法糖衣(syntactic sugar)”,事實上它是:

1
[player position].x

這邊position是一個getter,可以讓你從player身上取得一個CGPoint型態的position(r-value),但因為並沒有把指定給某個變數(l-value),所以當你要想用setter把它寫回去的時候,這個值已經消失了。

感想:看來Objective-C不只語法不同,連一些習慣寫法也不同了,眉眉角角真多!

 

 

分享到:
评论

相关推荐

    From C++ to Objective-C(中文版)

    Objective-C是一种结合了C语言特性和面向对象编程思想的编程语言。它最初由Brad Cox和Tom Love在20世纪80年代初设计,并在1986年由NEXTSTEP系统引入。Objective-C的主要特点是其独特的消息传递机制以及对C语言的兼容...

    Objective-C

    Objective-C是在C语言的基础上扩展了Smalltalk式的面向对象特性,使得它既有C语言的强大功能,又具备了面向对象编程的灵活性。 在Objective-C中,类是所有对象的基础。类定义了一组属性(实例变量)和方法(函数)...

    objective-c的计算器

    1. **Objective-C基础**:Objective-C是C语言的超集,它引入了Smalltalk的类、消息传递等面向对象特性。了解基本的数据类型、变量声明、控制流语句(如if、for、while)以及函数定义是开始的基础。 2. **类和对象**...

    Objective-C程序设计

    首先,Objective-C是在C语言基础上扩展的,它引入了消息传递机制和类的概念,这使得它具有高度的灵活性和可扩展性。在Objective-C中,对象通过发送消息来执行操作,这种机制类似于其他语言中的方法调用。消息传递的...

    Objective-C语言教程、案例与项目资源详解.docx

    ### Objective-C语言教程、案例与项目资源详解 #### 一、Objective-C基础知识 **1.1 类与对象** Objective-C的核心概念是类和对象。类是对象的模板或蓝图,它定义了对象应该具备哪些属性(如变量)和行为(如方法...

    Objective-C语言教程与案例.zip

    2. **语法结构**:Objective-C的语法有其独特性,比如它的方法定义和调用方式,以及在C语言基础上添加的“@”符号,如@property和@synthesize关键字。文档可能详细解释了这些语法元素的使用。 3. **Foundation框架*...

    学习Objective-C: 入门教程

    Objective-C是一种面向对象的编程语言,由ANSI C语言扩展而来,主要用于苹果公司的Mac OS X和iOS操作系统上应用程序的开发。它结合了C语言的高效性与Smalltalk语言的对象导向特性,使开发者能够构建复杂且功能丰富的...

    Objective-C经典入门源代码

    Objective-C是在C语言的基础上扩展的,因此,它继承了C的语法特性,如变量声明、控制结构(如if-else、for、while)、函数等。同时,它引入了消息传递机制,这是面向对象编程的核心。在Objective-C中,对象通过发送...

    objective-c 2.0 课后习题答案

    Objective-C 2.0 是苹果公司开发的一种面向对象的编程语言,它是C语言的超集,主要用于iOS和macOS的应用程序开发。Objective-C 2.0在Objective-C的基础上添加了一些新特性,使得代码更加简洁易读,提高了开发效率。...

    objective-c 程序设计 + 代码

    Objective-C是一种强大的面向对象的编程语言,主要用于Apple的Mac OS X和iOS操作系统。它基于C语言,添加了Smalltalk的类、消息传递等面向对象特性。在这个“Objective-C程序设计+代码”主题中,我们将深入探讨这个...

    iPhone开发资料之Objective-C语言简介

    Objective-C是一种面向对象的编程语言,它是C语言的超集,特别为苹果的iOS和macOS平台的软件开发而设计。Objective-C通过引入Smalltalk的影响,支持类、方法和属性等面向对象特性,使得程序员能够构建复杂的软件系统...

    Objective-C Succinctly.pdf

    - **语言特性**:Objective-C是一种面向对象的编程语言,结合了C语言和Smalltalk的特性,是苹果公司开发iOS和macOS应用的基础语言之一。 - **目标读者**:本书适合初学者以及有一定基础的开发者学习Objective-C语言...

    Objective-C Cheatsheet

    Objective-C结合了C语言的简洁性和Smalltalk风格的消息传递系统。它允许开发者创建面向对象的程序,并且在苹果生态系统中拥有悠久的历史和深厚的基础。 标题 "Objective-C Cheatsheet" 指的是一个快速参考指南,它...

    Objective-C Cheat Sheet

    ### Objective-C 快速参考与知识点详解 #### 目标:Objective-C Cheat Sheet解析与深入理解 Objective-C作为苹果公司开发iOS和OS X应用的主要语言之一,在编程领域占据着重要的地位。下面,我们将通过一份...

    Objective-C基础知识及简介.docx

    Objective-C不仅保留了C语言的所有功能,还引入了许多新的概念和技术,使得开发者能够更加高效地构建复杂的应用程序。 #### 二、面向对象基础 Objective-C作为一种典型的面向对象语言,支持类(Class)、对象(Object...

    从C++到 Objective-c

    此外,Objective-C 2.0还引入了新的关键字,如`@optional`, `@required`, `@property`, `@dynamic`, `@synthesize`等,用于简化属性的定义和实现。 #### 四、Objective-C的语法特色 ##### 1. 方法调用 - Objective...

    The Objective-C Programming Language

    Objective-C是一种通用、面向对象的编程语言,它是在C语言的基础上扩展而成的。Objective-C是苹果公司在开发macOS和iOS应用时的主要语言之一,尤其是在iOS开发初期。该语言的设计哲学强调了消息传递和动态类型。...

Global site tag (gtag.js) - Google Analytics