一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

IOS,objective

 昵稱11482448 2014-07-31

     轉(zhuǎn)帖請(qǐng)?jiān)陂_(kāi)頭處注明文章鏈接,請(qǐng)支持原創(chuàng)。

     一直有疑問(wèn),在objective_C中聲明變量會(huì)有 2種方式,今天有空和網(wǎng)友討論了下,并且自己查了stackoverflew后算是稍微弄懂了一點(diǎn)。記錄如下:

      用了一段oc;會(huì)發(fā)現(xiàn)有2種定義變量的方式

      1.在  @interface :NSObject{} 的括號(hào)中,當(dāng)然NSObject 是指一個(gè)父類,可以是其他的。

      形式如下:

1 @interface GCTurnBasedMatchHelper : NSObject {
2 BOOL gameCenterAvailable;
3 BOOL userAuthenticated;
4 }

  2.另外一種是直接在 @interface : NSObject{}括號(hào)之后,用 @property 去定義一個(gè)變量。

1 @property (assign, readonly) BOOL gameCenterAvailable;

  你會(huì)發(fā)現(xiàn),有人會(huì)再@interface中定義了變量后,又在 @property中重復(fù)定義相同的變量,而且很常見(jiàn)。

     結(jié)果可能是這樣:

復(fù)制代碼
1 @interface GCTurnBasedMatchHelper : NSObject {
2 BOOL gameCenterAvailable;
3 BOOL userAuthenticated;
4 }
5 
6 @property (assign, readonly) BOOL gameCenterAvailable;
復(fù)制代碼

  而且你可以單獨(dú)在@interface中定義變量,而不用@property定義;也可以只用@property去定義,而不在@interface中定義,當(dāng)然用了@property去定義,一般要在.m文件中用@synthsize去合成相應(yīng)的setter,getter方法。否則會(huì)得到一個(gè)警告。當(dāng)然@synthsize是可選的,但是是Apple推薦的,不用會(huì)有什么后果,我沒(méi)試過(guò),有興趣的童鞋可以試一下。

     那這兩種方式有什么區(qū)別呢。

    1. 只在@interface中定義變量的話,你所定義的變量只能在當(dāng)前的類中訪問(wèn),在其他類中是訪問(wèn)不了的;而用@property聲明的變量可以在外部訪問(wèn)。

    2.用了@property去聲明的變量,可以使用“self.變量名”的方式去讀寫(xiě)變量。而用@interface的方式就不可以。

    3.  這里給出一個(gè)鏈接:http:///questions/9702258/difference-between-properties-and-variables-in-ios-header-file    里面講到:  我英語(yǔ)菜,簡(jiǎn)單翻一下:

Defining the variables in the brackets simply declares them instance variables.

在括號(hào)中定義一個(gè)變量只是簡(jiǎn)單的聲明了一個(gè)實(shí)例變量(實(shí)例變量應(yīng)該指的成員變量)。  博主注:老外對(duì)variable 和instance variable是有不同理解的。所以下文中 用了一個(gè)模糊的詞 ivar。

Declaring (and synthesizing) a property generates getters and setters for the instance variable, according to the criteria within the parenthesis. This is particularly important in Objective-C because it is often by way of getters and setters that memory is managed (e.g., when a value is assigned to an ivar, it is by way of the setter that the object assigned is retained and ultimately released). Beyond a memory management strategy, the practice also promotes encapsulation and reduces the amount of trivial code that would otherwise be required.

聲明(和 @synthsize)一個(gè)屬性會(huì)為成員變量生成 getter 和setter方法,根據(jù)括號(hào)內(nèi)的標(biāo)準(zhǔn),在oc中經(jīng)常用setter和getter 做內(nèi)存管理,這是很重要的。(例如: 當(dāng)一個(gè)值被賦給這個(gè)變量,對(duì)象是通過(guò)setter函數(shù)去分配,修改計(jì)數(shù)器,并最后釋放的)。更高一個(gè)層次來(lái)說(shuō),這種做法也促進(jìn)了封裝,減少了一些不必要的代碼。

It is very common to declare an ivar in brackets and then an associated property (as in your example), but that isn't strictly necessary. Defining the property and synthesizing is all that's required, because synthesizing the property implicitly also creates an ivar.

在@interface括號(hào)中定義一個(gè)變量并用@property 重復(fù)定義一次是很普遍的,實(shí)際上不是必要的。用@property和@synthszie就夠了,因?yàn)樵谟聾synthsize合成這個(gè)屬性的讀寫(xiě)方法時(shí)就會(huì)創(chuàng)建一個(gè)變量。

The approach currently suggested by Apple (in templates) is:

目前蘋(píng)果(在模板中)建議的方法是這樣的:

-Define property in header file, e.g.:

先在頭文件中定義一個(gè)屬性

1 @property int gameCenter;

Then synthesize & declare ivar in implementation:

然后在實(shí)現(xiàn)文件中  synthsize和declare成這樣:

1 @synthesize gameCenter = __ gameCenter;

The last line synthesizes the gameCenter property and asserts that whatever value is assigned to the property will be stored in the __gameCenter ivar. Again, this isn't necessary, but by defining the ivar next to the synthesizer, you are reducing the locations where you have to type the name of the ivar while still explicitly naming it.

最后一行synthsize  gameCenter 屬性并說(shuō)明了不管什么值被分配給這個(gè)屬性,都會(huì)存儲(chǔ)到_gameCenter這個(gè)變量中。 再次說(shuō)明,這不是必要的,但是,這樣寫(xiě)了之后,你能減少輸入已經(jīng)明確命名的變量名。

  最后一句的意思you are reducing the locations where you have to type the name of the ivar while still explicitly naming it .不好翻。

   據(jù)千鋒的第2節(jié)語(yǔ)法課課程的講解,這樣寫(xiě)之后可以使得 @synthsize 時(shí)內(nèi)部getter方法會(huì)展成

1 -(int)gameCenter
2 {
3    return  _gameCenter;
4 }

 而直接寫(xiě)  @synthsize  gameCenter;

setter函數(shù)會(huì)在內(nèi)部展開(kāi)成

1 -(int)gameCenter
2 {
3    return  gameCenter;
4 }

  注意到:函數(shù)名和變量名是一樣的。在斯坦福的課程中,白胡子教授也模糊的說(shuō)道這樣的同名有可能帶來(lái)bug,具體什么bug他沒(méi)說(shuō),我也沒(méi)見(jiàn)過(guò),所以還是養(yǎng)成這樣寫(xiě)的習(xí)慣為好。其他語(yǔ)言的getter函數(shù)  一般會(huì)在變量前加 get;但oc沒(méi)有,可能是為了與其他語(yǔ)言做區(qū)分,算是oc的特色,結(jié)果卻帶來(lái)這么個(gè)麻煩。

 

     

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    成人午夜激情在线免费观看| 东京热男人的天堂一二三区| 男女一进一出午夜视频| 欧美日韩一级黄片免费观看 | 欧美有码黄片免费在线视频| 日韩欧美三级中文字幕| 韩国激情野战视频在线播放| 国内外激情免费在线视频| 老司机亚洲精品一区二区| 国产精品不卡一区二区三区四区| 97人妻精品免费一区二区| 成人日韩在线播放视频| 老外那个很粗大做起来很爽| 欧美欧美欧美欧美一区| 风间中文字幕亚洲一区| 午夜日韩在线观看视频| 欧美野外在线刺激在线观看| 欧美精品久久男人的天堂| 国产精品伦一区二区三区四季| 日韩在线欧美一区二区| 人妻亚洲一区二区三区| 99久久国产精品亚洲| 欧美日韩免费黄片观看| 国产av熟女一区二区三区四区| 国产免费一区二区三区av大片| 精品一区二区三区不卡少妇av | 成人免费在线视频大香蕉| 中文字幕区自拍偷拍区| 翘臀少妇成人一区二区| 国产av一区二区三区久久不卡| 中文人妻精品一区二区三区四区| 国产av熟女一区二区三区蜜桃| 亚洲清纯一区二区三区| 国产午夜福利一区二区| 亚洲第一视频少妇人妻系列 | 制服丝袜美腿美女一区二区| 国产福利在线播放麻豆| 久久这里只有精品中文字幕| 91后入中出内射在线| 极品少妇一区二区三区精品视频| 成在线人免费视频一区二区|