OC中的點運算

2021-07-02 22:50:46 字數 2257 閱讀 2332

傳統的oc程式語言是將表示式放在方括號裡面,類似[dog wangwang]這樣的結構。

為了迎合從其他語言和程式設計習慣的大神來到oc世界,同時也為了優化複雜的運算機制,oc引入了點運算這個概念。

下面通過例項來說明一下點運算是如何完成運算的。

首先定義了如下的dog類。並宣告和實現它的setter和getter方法。

#import @inte***ce dog : nsobject

- (void) setage:(int)newage;

- (int) age;

@end

#import "dog.h"

@implementation dog

- (void) setage:(int)newage

- (int) age

@end

在main函式中可以引入標頭檔案,並建立dog物件,然後對該物件age賦值。

#import #import "dog.h"

int main(int argc, const char * argv)

return 0;

}

列印結果如下:

dog1's age is 20
以上是傳統的宣告和賦值方法。

下面通過點運算做同樣的工作。main函式加入點運算**,結果如下:

#import #import "dog.h"

int main(int argc, const char * argv)

return 0;

}

列印結果如下:

dog1's age is 20

dog1's new age is 30

通過以上**可以發現,dog1.age的點運算實現了對dog1物件的賦值和取值操作。

這裡dog1.age並不是直接呼叫dog中的age成員變數,而是通過呼叫它的getter和setter方法來實現的讀取和賦值。

點語法是編譯器級別的語法。

編譯器會在編譯階段把dog1.age = 30;展開成[dog1 setage:30]; 同樣會吧dogage = dog1.age;展開成dogage = [dog1 age];

所以實際上還是執行了中括號的傳統語句。

那麼編譯器是怎麼轉換的呢?

oc語言中,setter函式和getter函式是有一定規範的,比如變數age的setter函式只能寫成setage,getter函式只能寫成age。

所以編譯器實質上執行的是無腦轉換....當發現點函式出現在等號左邊,就按格式轉換成setter,點函式出現在右邊,就按格式轉換成getter。

------------------------------

介紹兩個屬性,可以簡化我們編寫getter和setter函式。

@property 和 @synthesize 

@property屬性定義在.h檔案中,通過這個屬性編譯階段可以自動生成setter和getter函式。

@synthesize屬性定義在.m檔案中,通過這個屬性編譯階段可以自動實現setter和getter函式。

所以引入這兩個屬性,之前的**就可以簡化為:

#import @inte***ce dog : nsobject

@property int age;

@end

#import "dog.h"

@implementation dog

@synthesize age;

@end

main函式不變,執行成功,執行結果不變。

有時候有人會覺得這個getter函式和變數名一樣,搞得點這個函式就像是在點變數一樣,看著不方便。

下面介紹乙個方法可以有效改善這個問題。

就是定義成員變數的時候,在變數前面新增乙個下劃線符號,然後對@synthesize屬性稍作修改即可。修改後的**如下:

#import @inte***ce dog : nsobject

@property int age;

@end

#import "dog.h"

@implementation dog

@synthesize age = _age;

@end

以上就是本次關於點運算的筆記整理。

OC中的小知識點

打個比方,你要造乙個家,物件導向的思想就是,找個工程師畫圖紙,找工人修房子,在阿里巴巴買建材,在蘇寧易購買家電,找搬家公司把家具搬進去,ok.類就是圖紙,打個比方,房子的圖紙就是類 類裡面有1.變數2.方法 宣告類的目的 告訴系統我們這個類中有哪些屬性和方法 類名 首字母大寫 nsobject 為了...

OC中運算子 帶來的問題

問題描述 看下面 猜測一下執行結果?nsinteger m1 100 nsinteger m2 100 nsuinteger n 2 nslog m1 n ld m1 n nslog m2 n ld m2 n 問題分析 這個問題看似很簡單,但是卻存在乙個坑,稍不注意就會掉進去。上面 的輸出結果為 m...

OC中關於屬性,特性,點語法的總結

synthesize 屬性的實現部分,實現屬性自動生成的setter以及getter方法.name 屬性名,指定要實現哪乙個屬性生成的setter以及getter方法 name,指定setter和getter方法內部所要操作的例項變數.如果指定的例項變數沒有定義,系統會自動生成指定的例項變數,但是生...