幾個有用的Objective C新特性

2021-09-01 19:36:45 字數 1889 閱讀 9069

以前宣告屬性property,都要在類的實現@implementation裡將屬性和成員變數做相應的synthesize,synthesize的含義是將屬性和成員變數做關聯。早期宣告乙個屬性,需要同樣宣告乙個成員變數,然後@synthersize date=_date;將屬性與成員變數關聯起來,後來可以無需宣告成員變數,@synthersize date=_date;可以自動幫你宣告乙個名字為_date的成員變數,@synthersize date就是自動宣告乙個成員變數date。

xcode4.4以後,synthesize關鍵字也不需要寫了,例如@property (nonatomic, readwrite, retain) nsdate *date;編譯器可以自動繫結並且生成對應的成員變數nsdate *_date,相當於是自動新增了@synthesize date=_date;。這樣既不用再宣告成員變數,也不要費神寫@synthesize,方便不少。

當然凡事有例外,如果同時實現了setter和getter方法,例如上面你實現了-(void)setdate-(nsdate *)date,那麼編譯器就不會自動幫你synthesize。這裡同時實現setter和getter方法是針對readwrite屬性來說的,對於readonly屬性,那麼你實現了getter方法即-(nsdate *)date也同樣不會自動繫結成員變數。

以前在.m實現檔案中實現方法時經常會引用其他成員方法,而如果引用的成員方法未在標頭檔案或者匿名catrgory中宣告,同時也不在引用者前面,那麼編譯器會報未找到該方法的錯誤。現在新的編譯器中,只要在實現檔案裡的成員方法,在其他任何位置的方法中呼叫都不再報錯,nice!

最新的oc語法裡還新增了許多類似指令碼語言的特性,例如以前要生成nsnumber滿費勁,都是[nsnumber numberwith***]的寫法,太多冗餘。現在方便了,可以用@符號替代,例如[nsnumber numberwithchar:『c』]可以直接表示為@'c'[nsnumber numberwithint:123]直接表示為@123[nsnumber numberwithfloat:1.23f]z直接寫為@1.23f,其他型別同理變換。

nsarray的變化也是類似的,[nsarray array]就是@[nsarray arraywithobject:x]就是@[x][nsarray arraywithobjects:x, y, z, nil]就是@[x, y, z],不過這種方式生成的是nsarray,要生成nsmutablearray呢?也簡單,直接呼叫mutablecopy即可,例如[@[x, y, z] mutablecopy]。如果要訪問第1個元素,以前需要寫成[array objectatindex:0],現在可以直接用array[0]訪問,像極了指令碼語言。

nsdictionary的變化和nsarray類似,不同的是用@{},例如[nsdictionary dictionarywithobject:value forkey:key]可以表示為@。訪問時也和大多數指令碼語言一樣,用dict[key]來獲得鍵值對應的值。

至於以上簡化的方法到底要不要用,還是看自己或者專案組的習慣了,個人建議是在符合統一編碼規範的情況下,盡量擁抱變化,畢竟這些都是為了優化生產效率的變化。

幾個有用的巨集

分類 c c 1.列印錯誤資訊 如果程式的執行必須要求某個巨集被定義,在檢查到巨集沒有被定義是可以使用 error,warning列印錯誤 警告 資訊,如 ifndef unix error this section will only work on unix systems endif 只有 u...

幾個有用的巨集

1.列印錯誤資訊 如果程式的執行必須要求某個巨集被定義,在檢查到巨集沒有被定義是可以使用 error,warning列印錯誤 警告 資訊,如 ifndef unix error this section will only work on unix systems endif 只有 unix 巨集被...

objective c之有用結構體

typedef struct nsrangensrange 這個結構體用來表示相關事物的範圍,通常是字串裡的字元範圍或者陣列的元素範圍,location用來表示起始位置,length表示該範圍所含元素的個數。例如有乙個字串 myname is leo 單詞 is 可以用location為8,leng...