iOS常量、變數、屬性及其特性,ios常量變數特性

來源:互聯網
上載者:User

iOS常量、變數、屬性及其特性,ios常量變數特性

1.Objective-C中聲明常量使用關鍵字const。如:const double PI = 3.1514;

2.Objective-C中變數可以分為成員變數、局部變數和全域變數(用的很少,盡量不要用)。

//————————------------常量—————————————————//

方法一:

    #define kDetailKey            @“detail text”

    #define DOWNLOAD_TIMEOUT      60.0

    #define degresssToRadian(x)   (M_PT*(X)/180.0)

    這種方法直接使用#define定義函數、字串和數字,和普通的C/C++一樣,唯一的區別是字串需要在前面加上“@”符號。

 

方法二: 

    typedef enum{

        kTagLanguageView = 100,

        kTagSeriesView,

        kTagSeriesDetailView,

        kTagThumbView,

        kTagVideoView,

        kTagFullPhotoView,

    }TagSystemViews;

    使用枚舉定義常量,在這裡kTagSeriesView等於101,在程式中直接使用kTagSeriesView來表示這個常量,這和C/C++一樣。 

 

方法三:

    在.m或者.mm檔案中使用靜態常量聲明,和C/C++使用方法一樣,例如:

static NSString *BlockColorAlphaComponentKey =@"blockColorAlphaComponent”;      

 

 

//————————------------變數—————————————————//

1.為了強制一個對象隱藏其資料,編譯器限制執行個體變數範圍以限制其在程式中的可見度。

   但是為了提供靈活性,蘋果也讓開發人員顯示設定範圍(四選一)。

2.四種編譯指令如下:

@private    

    執行個體變數只能被聲明它的類訪問。

 

@protected  

    執行個體變數能被聲明它的類和子類,所有沒有顯示指定範圍的執行個體變數都是@protected。

 

@public    

    執行個體變數可以在任何地方被訪問。

 

@packge

    使用modern運行時,一個@package執行個體變數在實現這個類的可執行檔鏡像中實際上是@public的,但是在外面就是@private。

    OC中的@package與C語言中的變數和函數的private_extern類似。任何在實作類別的鏡像之外想使用這個執行個體變數都會引發link error。

    這個類型最常用於架構類的執行個體變數,使用@private太限制,使用@protected或者@public又太開放。

 

 

 

//——————————————屬性—————————————————//

屬性:@property:@property只不過是給編譯器看的一種指令,它可以編譯之後自動為你產生相應的getter和setter方法。 

1.公用屬性工作表示你打算如何使用這一類的對象。

2.屬性聲明是一個指令,它告訴編譯器如何為變數產生存取方法。(添加屬性聲明後,你將瞭解到有關存取方法的資訊)

3.id類型是一個通用類型,OC使用id表示任意類型的對象,它可以作為一個預留位置表示這是一個不確定的類型的對象或者引用。因此,所有的對象都可以用id來表示。

4.編譯器指令@property可以為一個類聲明屬性,這是一個偷懶的好方法,用@property聲明屬性相當於同時聲明並實現了對應的執行個體變數的訪問器方法。當然,也可以通過指定屬性的特性(Attribute)類控制自動產生的訪問器方法的行為。

 

5.OC裡的執行個體變數預設都是私人的。私人變數只在類自身和子類的執行個體方法裡可見。

 

6.iOS OC聲明變數在@interface括弧中和使用@proper的區別:

方式一:直接在@interface中的大括弧中聲明。

@interface MyTest:NSObject

{

NSString *mystr;

 

}

方式二:直接用@property聲明

@interface MyTest:NSObject

@property(strong,nonatomic)NSString *mystr;

隨後在.m檔案中@synthesize mystr = _myStr;(也可以在.m檔案中不加@synthesize)

區別:

方式一聲明的成員變數是只能在自己類內部使用,而不能在類的外部使用(就是通過類名.點的方式顯示不出來。)。

方式二可以在類的外部存取,也可以在類的內部通過底線+變數名或者self.變數名的方式訪問。

蘋果開發模板推薦的是方式二。

7.OC是C的嚴格父集,C能做的事情OC中都能做。

屬性實際上一個setter方法和一個getter方法,所有對執行個體變數的訪問都是如此,通過setter方法設定值,通過 getter方法擷取值

你沒有必要去最佳化沒有必要最佳化的東西,你要最佳化的是很花時間的東西,而訪問執行個體變數不會花太多時間。

8..h是共有的API

.m是私人的API以及你所有的實現。

 

所有指標要麼是強的,要麼是弱的,因為OC需要知道怎樣處理記憶體和堆。強表示保持這個的儲存,在堆中,保持這個所指的東西

 

7.plist:屬性設定檔,基於XML格式,也扮演了一部分定義UI的角色,Xcode在編譯的時候會讀取裡面的配置資訊。

8.類的聲明提供了這個類和程式員之間的介面,類的聲明即介面,其實現代碼才是真正執行實際任務的地方。類的聲明以@interface指令開始,以@end指令結束。

9.藍色的豎線:它是UI控制項和螢幕邊框的距離輔助線以及對齊輔助線,用於設定控制項在不同大小的螢幕上的位置。

 

 

13.屬性使用點文法,其他情況使用方括弧標記文法。

***********************************

copy:

1.簡單複製只能實現淺拷貝:指標賦值,使每個指標指向相同的一塊記憶體空間,操作不安全。

2.在iOS中可以這樣實現:Foundation類已經遵守了<NSCopying>和<NSMutableCopying>協議,即實現了copy和mutableCopy方法,因此Foundation對象可以使用這些方法建立對象的副本或可變副本。

 

************************** 

為屬性聲明自訂特性

1.訪問器方法

    a。我們通過@synthesize這個標記來為屬性產生訪問器方法。

    b。預設情況下,如果我們聲明的屬性名稱為propertyName,那麼編譯器自動產生的訪問器方法分別為propertyName:和setPropertyName:。

    c。可以通過“getter=getterName”和“setter=setterName”這兩個屬性的自訂特性來設定訪問器方法的名稱。

    d。自訂訪問器方法的名稱會導致“點句式”文法糖不好使。

2.可寫性

    如果給屬性加上readonly的特性:編譯器不會自動產生setter訪問器方法,屬性也就變成唯讀。

3.setter支援的特性

    a。setter方法不僅僅是簡單的賦值,有這麼幾個修飾詞是用來描述setter方法的:assign,retain,copy和weak,用不同的修飾詞表示產生的setter方法會有所不同。

    b。預設是assign,這意味著在setter方法中真的就是簡單的賦值。

    c。retain:表示賦值之後會調用新值的retain方法和舊值的release方法。

    d。copy:表示先將值拷貝一份,然後將這個拷貝賦給執行個體變數,這個修飾詞只適用於實現了NSCopying協議的類型。

    e。weak:表示這個值將是一個弱引用,引用和被引用之間沒有所屬關係。如果系統銷毀了某個屬性所引用的對象,屬性的值會自動地變為nil。一般情況下,如果父物件擁有子物件的引用,那麼子物件就不應該再持有父物件的強引用,而是使用弱引用的方式來引用父物件。

    f。strong:表示這個值是一個強引用,引用和被引用之間具有所屬關係。從記憶體使用量的角度來看,就是引用對象被回收之前,被引用的對象不會被回收。

4.原子化和非原子化:atomi和nonatomic用來決定編譯器產生的getter和setter是否為原子操作。

 

    a。nonatomic指定訪問器方式是非安全執行緒的,即多個線程可以同時訪問這個屬性。

    b。預設情況下,訪問器方法都是 安全執行緒的,即使在多線程環境中也毫無風險的。然而,即使要保證在多線程環境中能正常工作,訪問器也不一定必須是安全執行緒的。而將訪問器方法指定為非安全執行緒的,可以讓getter方法直接返回執行個體變數的值,效率更高。

 

********************

合成(Synthesizing)屬性

1.聲明一個屬性之後編譯器會自動將相關的代碼補充完整,即編譯器會自動聲明一個執行個體變數以及相關的訪問器方法,執行個體變數的名稱是屬性名稱前面加上底線。

2.不過有時候我們需要自己來指定執行個體變數的名稱,這時候就需要用到@synthesize指令了。

3.

    a。如果你不得不手動指定屬性對應的執行個體變數的名稱,請在@implementation指令之後使用@synthesize指令做如下聲明:

        @synthesize label;

這行代碼要求編譯器根據介面中聲明的屬性來自動產生訪問器方法。

    b。也可以使用如下的方式來指明訪問器方法使用的執行個體變數的名稱:

        @synthesize label = _label;

這裡指明了執行個體變數名為_label,而且這是一種很好的封裝執行個體變數的方法,讓所有對該執行個體變數的訪問都通過訪問器方法來執行。同時,這種方法也可以避免編譯器自動取名字時和已用的執行個體變數名稱衝突的情況。

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.