建立物件
多數時候,我們建立物件以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...