4 Foundation和帶屬性的字串(1)

2021-06-22 02:53:15 字數 4372 閱讀 5569

建立物件

多數時候,我們建立物件以alloc和init...

nsmutablearray *card = [[nsmutablearray alloc] init];

cardmatchinggame *game = [[cardmatchinggame alloc] initwithcardcount:12 usingdeck:d];

或者以類方法

nsstring:     

+ (instancetype)stringwithformat:(nsstring *)format, ...

nsstring *moltuae = [nsstring stringwithformat:@"%d", 42];

uibutton:     

+ (id)buttonwithtype:(uibuttontype)buttontype;

nsmutablearray:     

+ (instancetype)arraywithcapacity:(nsuinteger)numitems;

nsarray:

+ (instancetype)arraywithobject:(id)anobject;

有時類建立方法與init方法共存

[nsstring stringwithformat:...]

等同

[[nsstring alloc] initwithformat:...]
不要被這個干擾。使用任一版本皆可。

ios似乎傾向分配/初始化版本在新的api,但大多是中性的。

你也可以要求其他物件來為你建立新的物件

nsstring:

nsarray:

- (nsstring *)componentsjoinedbystring:(nsstring *)separator;

nsstring與nsarray:

- (id)mutablecopy;

但是,並非其他物件給出的物件都是新建立的

nsarray:

- (id)lastobject;

nsarray:

- (id)objectatindex:(nsuinteger)index;

除在它的方法有「copy」這個單詞,如果物件已經存在,你將得到乙個指向它的指標

如果物件不是已經存在的,這時建立

nil

給nil發訊息(通常)是ok的。沒有**會執行。

如果該方法返回乙個值,它會返回零。

int i = [obj methodwhichreturnsanint]; // 如果obj是nil,i將會是零

依靠這個並且

編寫**

使用這個

是絕對沒問題的

但要小心,如果該方法返回乙個c結構。返回值是不確定的。

cgpoint p = [obj getlocation]; // 如果obj是nil,p將有乙個不確定的值

動態繫結

objective-c有個重要的型別叫做id

意思是「指向乙個未知/不確定的物件」型別

id myobject;

真正的所有的物件指標(如的nsstring*)在執行時將像id一樣對待

但是在編譯的時候,如果你輸入nsstring*的東西,而不是id的,編譯器可以幫助你

它可以發現bug,並建議用什麼方法將是適合發給它的,等

如果你使用的id型別的東西,編譯器不會有很大的幫助,因為它知道的並不多

弄清楚當訊息在執行時傳送,**的執行被稱為「動態繫結」

它安全麼?

對待所有物件指標為「指向未知型別的」在執行時看似危險,對不對?

是什麼阻止你傳送訊息到它不明白的乙個物件?

什麼都沒有。並且如果你這樣做你的程式會崩潰。天哪,objective-c程式必須崩潰很多

了!不盡然

因為我們大多使用靜態型別(如nsstring*)並且編譯器真的是很聰明

靜態型別

nsstring* s =@「x」;     //「靜態」型別(如果s傳送非nsstring訊息,編譯器會發出警告)

id obj = s; //不是靜態型別,但是完全合法;編譯器不能捕獲[obj rank]

nsarray *a = obj; //同樣合法,但很明顯會導致一些**煩!

編譯器不會抱怨id和靜態型別變數之間的分配

有時候,你正在默默地這樣做。你已經這樣做了!

- (int)match:(nsarray *)othercards

切勿使用「id *」的方式(這將意味著「乙個指向物件的指標的指標」)

我們什麼時候故意地使用這個危險的情況呢!

當我們想把不同類的物件混在同乙個集合的時候(例如在乙個nsarray)

當我們想在mvc中支援的「盲的,結構化」的通訊(即委託)

而且,還有其它通用或盲的通訊需求

但是為了讓這些更安全,我們將使用兩件事:內省和協議內省

在執行時詢問物件是什麼類或者可以傳送什麼訊息給它協議

語法是「介於兩者之間」id和靜態型別

沒有指定物件指向的類,但是指定了什麼方法是它實現的

例如...

id scrollviewdelegate;

我們將在下週討論如何宣告和使用協議內省

所有繼承自nsobject類的物件知道這些方法...

iskindofclass:     返回bool:乙個物件

是否屬於這個類的一種(包括繼承)

ismemberofclass:     返回bool:乙個物件

是否屬於這個類的一種(不包括繼承)

respondstoselector:     返回bool:乙個物件是否響應乙個給定的方法

它可以在執行時計算這些問題的答案

給這些方法引數有點麻煩

類的測試方法用class

你通過傳送類方法class到乙個類來得到乙個類

if ([obj iskindofclass:[nsstring class]])

方法的測試方法用選擇器(sel)

特有的@selector( )指令,把乙個方法名轉化到乙個選擇器

if ([obj respondstoselector:@selector(shoot)])  else if ([obj respondstoselector:@selector(shootat:)])

sel是選擇器的objective-c「型別」

sel shootselector = @selector(shoot);

sel shootatselector = @selector(shootat:);

sel movetoselector = @selector(moveto:withpencolor:);

在nsobject中使用performselector:或者performselector:withobject:方法

[obj performselector:shootselector];

[obj performselector:shootatselector withobject:coordinate];

在nsarray中使用makeobjectsperformselector:方法

[array makeobjectsperformselector:shootselector];     //酷吧?

[array makeobjectsperformselector:shootatselector withobject:target]; //目標是乙個id

在uibutton中,- (void)addtarget:(id)anobject action:(sel)action …; 

[button addtarget:self action:@selector(digitpressed:) ...];

4XML 元素和屬性

1xml元素 xml 元素指的是從 且包括 開始標籤直到 且包括 結束標籤的部分。乙個元素可以包含 在上面的例項中,和 都有元素內容,因為他們包含其他元素。元素也有屬性 category children 和 有文字內容,因為他們包含文字。2.xml 元素必須遵循以下命名規則 3.xml屬性 屬性 ...

4 計算屬性和偵聽器

before computed p after computed p div var vm newvue computed console.log vm.message console.log vm.data.message console.log vm.computed console.log v...

4 計算屬性和觀察者

對於任何複雜邏輯,你都應當使用計算屬性。1 基礎例子 original message computed reversed message var vm new vue computed 可以像繫結普通屬性一樣在模板中繫結計算屬性。vue 知道vm.reversedmessage依賴於vm.mess...