傳統的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方法內部所要操作的例項變數.如果指定的例項變數沒有定義,系統會自動生成指定的例項變數,但是生...