歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> iOS常量、變量、屬性及其特性

iOS常量、變量、屬性及其特性

日期:2017/3/1 9:29:09   编辑:Linux編程

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,而且這是一種很好的封裝實例變量的方法,讓所有對該實例變量的訪問都通過訪問器方法來執行。同時,這種方法也可以避免編譯器自動取名字時和已用的實例變量名稱沖突的情況。

Copyright © Linux教程網 All Rights Reserved