Objective-C之成魔之路【8-訪問成員變數和屬性】

來源:互聯網
上載者:User

標籤:objective-c   物件導向   對象   ios開發   屬性   

重開發人員的勞動成果,請勿轉載


訪問成員變數

從物件導向的封裝角度考慮問題, 要想訪問類中的成員變數, 是要通過方法訪問的, 成員變數前面要有範圍限定符(protected, public, private) , 這些存取許可權修飾符我們將在後面介紹。 
成員變數的訪問, 是通過讀取方法(getter) 和設定方法(setter)。

訪問成員屬性:

可以使用點運算子.,或發送訊息[]


以上一節中的音樂類為例子:Song.h檔案
@interface Song : NSObject {
NSString *title;
NSString *artist;
long int duration;
}
//操作方法
- (void)start;
- (void)stop;
- (void)seek:(long int)time;
//訪問成員變數方法
- (NSString *)title; 
- (void) setTitle:(NSString *) newTitle;
- (NSString *)artist; 
- (void) setArtist:(NSString *) newArtist;
- (long int)duration; 
- (void) setDuration:(long int) newDuration;
@end

Song.m檔案
@implementation Song
- (void)start {
//開始播放
}
- (void)stop {
//停止播放
}
- (void)seek:(long int)time {
//跳過時間
}
//訪問成員變數方法
- (NSString *)title {
return title;
}
- (void) setTitle:(NSString *) newTitle {
title = newTitle;
}
- (NSString *)artist {
return artist;
}
- (void) setArtist:(NSString *) newArtist {
artist = newArtist;
}
- (long int)duration {
return duration;
}
- (void) setDuration:(long int) newDuration {
duration = newDuration;
}
@end

小結
採用了封裝之後就可以通過存取方法訪問屬性, 例如[mySong title] 是取得title成員變數內容。 
如果不考慮封裝的問題, 單從技術上講Objective-C, 可以直接通過對象訪問成員變數的, 訪問操作符是“->” , 例如:
mySong->title, 也可以取得title成員變數的內容。

需要指出的是,也可以對自訂的方法使用點運算子,不僅僅是使用在synthesize上(即屬性)。

注意:

點運算子和發訊息都是可以的,但是,點運算子通常使用在屬性上,用於設定或取得執行個體變數的值。

方法在Apple的文檔中被標記為任務(Task),任務通常不是由點運算子執行的,

而是使用傳統的方括弧形式的訊息運算式作為首選的文法。

另外,使用合成(synthesize)的存取方法,屬性名稱的前面不要以new、alloc、copy和init這些此開頭。

這與編譯器的一些假定有關,因為編譯器會合成相應的方法。



屬性
對於成員變數的訪問, 要通過讀取方法(getter) 和設定方法(setter) 。 在實現部分也要實現這些讀取方法和設定方法, 為了簡化這些瑣碎編碼Objective-C2.0提出屬性的概念, 使用 @property關鍵字在介面部分定義屬性, 在實現部分使用 @synthesize關鍵字在組裝和合成這些屬性。
這種可自動產生設值方法和取值方法(統稱為存取方法)。

具體步驟如下:

1)在介面部分中使用@property指令識別屬性。

@interface Fraction : NSObject

@property int numerator, denominator;

@end

2)在實現部分使用@synthesize指令即可。

@inplementation Fraction

@synthesize numerator, denominator;

@end


再次實現標頭檔如下:@interface Song : NSObject {
NSString *title;
NSString *artist;
long int duration;
}
//操作方法
- (void)start;
- (void)stop;
- (void)seek:(long int)time;
//訪問成員變數方法
@property(copy,readwrite) NSString *title;
@property(nonatomic,retain) NSString *artist;
@property(readonly) long int duration;
@end

代碼說明:
聲明property的文法為: @property (參數) 類型 名字; , 
這裡的“參數” 主要分為3大類: 
?讀寫屬性(readwrite/readonly) ; 
?記憶體管理(assign/retain/copy) , 這些記憶體管理的參數, 我們將在記憶體管理小節部分介紹; 
?原子性atomicity(nonatomic) , 是關係線程安全執行緒的,atomicity是原子性的安全執行緒的, 但是會影響效能。 如果確定不考慮安全執行緒問題可以使用 nonatomic。注意:

如果使用了@property指令,就不需要在實現部分聲明相應的執行個體變數。

通常,如果有稱為x的屬性,那麼在實現部分包括以下行會導致編譯器自動實現一個取值方法x和一個設定方法setX:

@synthesize x;

因為產生的存取方法是高效的,並且在使用多個核心的多台機器上,使用多線程時也可正常運行。

(這裡的說法呢,就是說安全執行緒的)


實現.m檔案如下:@implementation Song
@synthesize title;
@synthesize artist;
@synthesize duration;
- (void)start {
//開始播放
}
- (void)stop {
//停止播放
}
- (void)seek:(long int)time {
//跳過時間
}
@end

Objective-C之成魔之路【8-訪問成員變數和屬性】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.