成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Objective-C之@property和@synthesize

移動開發(fā) iOS
今天要說的內(nèi)容是Objective-C 中的 @property和@synthesize。在這之前先講講訪問器(Accessor),也就是我們所知道的setter和getter方法。 《Cocoa Design Patterns》中的將它歸類為基礎(chǔ)模式中的一種。訪問器是很重要的技術(shù),用來訪問和設(shè)置對象的實例變量(不是指對象本身,而是對象中的屬性)。有時候 可能需要用不同的方式或者通過計算等方式來獲取或設(shè)置實例變量,訪問器給了我們很大的靈活性。

我用了不到一周的時間學(xué)習(xí)了Objective- C,后面的大部分時間我都在了解如何使用iOS的SDK和一些高級的話題,到目前已經(jīng)有兩個多月的時間了。目前能做一些簡單的應(yīng)用,但是在寫代碼的時候明 顯感覺到基礎(chǔ)不夠扎實,畢竟一周的時間只能對一門語言有個概覽。要想精通一門語言是遠(yuǎn)遠(yuǎn)不夠的。

所以我把自己學(xué)習(xí)過程中遇到的一些問題整理在博客上,這也是一個學(xué)習(xí)理解的過程。

今天要說的內(nèi)容是Objective-C 中的 @property和@synthesize。在這之前先講講訪問器(Accessor),也就是我們所知道的setter和getter方法。 《Cocoa Design Patterns》中的將它歸類為基礎(chǔ)模式中的一種。訪問器是很重要的技術(shù),用來訪問和設(shè)置對象的實例變量(不是指對象本身,而是對象中的屬性)。有時候 可能需要用不同的方式或者通過計算等方式來獲取或設(shè)置實例變量,訪問器給了我們很大的靈活性。在Cocoa中訪問器有很多的優(yōu)點:

  • 實現(xiàn)靈活性。 可以在訪問器中改變并實現(xiàn)不同的實例變量訪問方式而不影響其他代碼。
  • 可維護性。通過訪問器對實例變量的更改易于維護。
  • 內(nèi)存管理。訪問器方法提供了簡單的方法去遵守Cocoa的約定把內(nèi)存管理代碼隔離在少部分代碼中。
  • 支持KVC和KVO。 KVC和KVO是很強大的技術(shù)。但是它們依賴于正確命名訪問器。

下面這段代碼簡單的實現(xiàn)了一個訪問器(setter和getter):

  1. //setter 
  2.     -(void)setStuName:(NSString *)stuName 
  3.       {  //_stuName 是實例變量 
  4.          if (_stuName != stuName) 
  5.          { 
  6.             [_stuName release]; 
  7.              _stuName = [stuName copy]; 
  8.          } 
  9.       } 
  10.     //getter 
  11.       -(NSString *)stuName 
  12.       { 
  13.          return _stuName; 
  14.       } 

上面代碼中的setter中還涉及到一定的內(nèi)存管理,既然這個技術(shù)這么重要,那么有沒有一種更方便的方法去做呢?答案就是@property和@synthesize。它們是Objective-C 2.0加入的指令,前者用于聲明,后者用于合成訪問器,結(jié)合使用就可以自動生成訪問器了。

下面這段代碼使用@property和@synthesize:

  1. @interface Student : NSObject 
  2.     @property (nonatomic, copy) NSString *stuName; 
  3.     @end      
  4.     @implementation Student 
  5.     @synthesize stuName = _stuName; 
  6.     @end

這段代碼的效果跟上面代碼的效果是一樣的,是不是很方便呢?

使用@property和@synthesize很方便,但又給我們帶來了很多疑問比如在上面的代碼中又出現(xiàn)了nonatomic和copy,是什么意 思?在@property中還有其他幾個關(guān)鍵字,它們都是有特殊作用的,我把它們分為三類分別是:原子性,訪問器控制,內(nèi)存管理。

原子性

atomic(默認(rèn)):atomic意為操作是原子的,意味著只有一個線程訪問實例變量。atomic是線程安全的至少在當(dāng)前的訪器上我是安全的。它是一個默認(rèn)的,但是很少使用。它的比較慢,這跟ARM平臺和內(nèi)部鎖機制有關(guān)。

nonatomic: nonatomic跟atomic剛好相反。表示非原子的,可以被多個線程訪問。它的速度比atomic快。但不能保證在多線程環(huán)境下的安全性,在單線程和明確只有一個線程訪問的情況下廣泛使用。

訪問器控制

readwrite(默認(rèn)):readwrite是默認(rèn)的,表示同時擁有setter和getter。

readonly: readonly 表示只有g(shù)etter沒有setter。

有時候為了語意更明確可能需要自定義訪問器的名字:

  1. @property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name; 

最常見的是BOOL類型,比如標(biāo)識View是否隱藏的屬性hidden??梢赃@樣聲明

  1. @property (nonatomic,getter = isHidden ) BOOL hidden; 

要注意修改setter或者getter的名字是存在副作用的,可能會使KVC和KVO無法正常工作。

內(nèi)存管理

retain:使用了retain意味著實例變量要獲取傳入?yún)?shù)的所有權(quán)。具體表現(xiàn)在setter中對實例變量先release然后將參數(shù) retain之后傳給它。下面這段代碼展示了retain類似的行為:

  1. -(void)setStuName:(NSString *)stuName 
  2.       { 
  3.          if (_stuName != stuName) 
  4.          { 
  5.             [_stuName release]; 
  6.              _stuName = [stuName retain]; 
  7.          } 
  8.       } 

assign(默認(rèn)):用于值類型,如int、float、double和NSInteger,CGFloat等表示單純的復(fù)制。還包括不存在所有權(quán)關(guān)系的對象,比如常見的delegate。

strong:是在ARC伴隨IOS引入的時候引入的關(guān)鍵字是retain的一個可選的替代。表示實例變量對傳入的參數(shù)要有所有權(quán)關(guān)系即強引用。strong跟retain的意思相同并產(chǎn)生相同的代碼,但是語意上更好更能體現(xiàn)對象的關(guān)系。

weak: weak跟assign的效果相似,不同的是weak在對象被回收之后自動設(shè)置為nil。而且weak智能用在iOS 5或以后的版本,對于之前的版本,使用unsafe_unretained。

unsafe_unretained:weak的低版本替代。  

copy:copy是為是實例變量保留一個自己的副本。

現(xiàn)在明白了@property是怎么回事了,但是@synthesize是怎么回事,看看之前的***段代碼:

  1. @synthesize stuName = _stuName; 

這里的stuName = _stuName是什么意思?stuName是propertyName跟@property聲明的名字一樣。而后面的_stuName 是實例變量名。生成的訪問器就是來訪問的 _stuName的。代碼的樣子就和最開始那setter和getter代碼所描述的一樣。

注意一個問題,我們并沒有聲明_stuName這個變量,這是編譯器自動幫我們創(chuàng)建的。 如果這段指令我換個寫法:@synthesize stuName = a;   并且我們沒有在interface里面聲明這個變量,那么會自動創(chuàng)建一個變量a。

如果這里寫成這樣:

  1. <em>@synthesize stuName; 
  2.     //等同于 
  3.     @synthesize stuName = stuName;</em> 

在Xcode4.4中,Xcode添加的一些新的編譯特性。其中一個就是默認(rèn)合成(Default Synthesis)。默認(rèn)合成就不再需要顯示的使用@synthesize指令了,這很方便但是要注意的是,默認(rèn)合成遵守的約定,這里的也就是命名規(guī)則是propertyName = _propertyName。 

下面一段代碼幫助理解:

  1. //對于下面的@propety 
  2.     @property (nonatomic, copy) NSString *stuName; 
  3.     //默認(rèn)合成的規(guī)則是這樣: 
  4.     @synthesize stuName = _stuName; 

以上是我所了解的@property和@synthesize,如果跟你的理解不同,或者有什么錯誤,請給我留言:)。

責(zé)任編輯:閆佳明 來源: oschina
相關(guān)推薦

2011-08-17 10:00:12

Objective-CProperty

2011-07-19 17:18:35

Objective-C Property

2011-07-29 15:47:21

iPhone開發(fā) Objective- C

2013-07-24 19:19:03

Objective-CiOS開發(fā)動態(tài)特性之protoc

2011-08-03 16:22:05

Objective-C CodeBlocks

2011-08-10 18:07:29

Objective-C反射

2013-06-20 10:40:32

Objective-C實現(xiàn)截圖

2013-03-27 12:54:00

iOS開發(fā)Objective-C

2011-05-11 15:58:34

Objective-C

2011-05-11 11:20:26

Objective-C

2011-07-08 18:44:09

Objective-C Self Super

2014-09-26 09:49:48

SwiftObjective-C

2011-07-28 15:11:23

iOS Objective-

2011-08-09 15:53:28

2011-05-11 13:54:08

Objective-C

2011-05-11 15:45:50

內(nèi)存管理Objective-C

2011-08-02 13:16:36

Objective-C 語法 函數(shù)

2011-08-04 11:15:46

Objective-C 構(gòu)造函數(shù) 構(gòu)造方法

2011-05-11 14:06:49

Objective-C

2011-08-04 14:58:37

Objective-C Cocoa NSString
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品久久久久中文字幕欢迎你 | 成年人精品视频 | 91porn国产成人福利 | 夜夜爽99久久国产综合精品女不卡 | 99九九视频 | 久久国产精品久久久久久 | 国产在线观看一区二区三区 | gav成人免费播放视频 | 日韩精品在线网站 | 日韩视频在线免费观看 | 一级黄片一级毛片 | 99精品99 | 日韩在线观看中文字幕 | 91免费福利视频 | 成人av久久| 99免费在线视频 | 99视频免费看 | 久久久影院 | 岛国二区 | 国产999精品久久久 午夜天堂精品久久久久 | 欧美在线亚洲 | 人人射人人草 | 天堂在线免费视频 | 日韩成人在线观看 | 成人一区二区三区 | 高清欧美性猛交 | 毛片综合 | 欧美综合国产精品久久丁香 | 国产美女精品视频免费观看 | 男女视频在线看 | 精品国产欧美一区二区 | 成人av网站在线观看 | 色av一区二区 | 亚洲va国产日韩欧美精品色婷婷 | 日本天天操 | 国产精品久久久久久久久久免费看 | 午夜视频在线观看网址 | 精品1区2区| 亚洲免费一区 | 在线看片国产 | 久热精品免费 |