ios 基礎的整理

2021-08-27 09:12:11 字數 3433 閱讀 7876

實體化後的類我們稱之為物件(object)

在objective-c裡面,類的 定義從@inte***ce開始到@end結束,也就是說,編譯器看到了@inte***ce就知道了這是類的定義的開始,看到了@end就知道,類的定 義結束了。

在obejctive-c裡面原則上,你可以不使用 nsobject,構築乙個你自己的根類,但是事實上這樣做將會有很大工作量,而且這樣做沒有什麼意義,因為蘋果為你提供的nsobject經過了很長時 間的檢驗。

(-)減號就是告訴編譯器,減號後面的方法,是實體方法(instance method)。實體方法的意思就是說,這個方法在類沒有被實體化之前,是不能執行的。(+)我們把帶加號的 方法稱為類方法(class method),和實體方法相對應,類方法可以脫離實體而執行。

在objective-c裡面方法的返回型別需要用圓括號包住,當編譯器看到減號或者加號後面的括號了之後,就會認為這是在宣告方法的返回值。你也 可以不宣告返回值,objective-c的編譯器會給沒有寫顯式的返回值函式加上乙個預設的返回值,它的型別是id。

編譯器會把從@implementation到

@end之間的部分看作是類的定義。@implementation的後面要有乙個空格。

我們來回憶一下c語言裡面函式的呼叫過程,實際上編譯器在編譯的時候就已經把函式相對於整個執行包的入口位址給確定好了,函式的執行實際上就是直接 從這個位址開始執行的。objective-c使用的是一種間接的方式, objective-c向物件或者類(具體上是物件還是類的名字取決於方法是實體方法還是類方法)傳送訊息,訊息的格式應該和方法相同。[cattlenew]就是說,向cattle類傳送乙個new的訊息。這樣當cattle類接收到new的時候,就會查詢它可以相應的訊息的列表,找到了new之後就會呼叫new的這個類方法,分配記憶體和初始化完成之後返回乙個id,這樣我們就得到乙個物件。

objective-c在編譯的過程當中,編譯器是會去檢查方法是否有效的,如果無效會給你乙個警告。但是編譯器並不會阻止你執行,因為只有在執行 的時候才會觸發訊息,編譯器是無法**到執行的時候會發生什麼奇妙的事情的。使用這樣的機制給程式毫無疑問將給帶來極大的靈活性,因為我們和任意的對物件 或者類傳送訊息,只要我們可以保證執行的時候類可以準確地找到訊息並且執行就可以了,當然如果找不到的話,執行會出錯。

%@,這是在告訴編譯器,需要把%@用乙個後面定義的字串或者其他什麼的來替換。

sel型別

objective-c在編譯的時候,會根據方法的名字(包括引數序列),生成乙個用 來區分這個方法的唯一的乙個id,這個id就是sel型別的。我們需要注意的是,只要方法的名字(包括引數序列)相同,那麼它們的id都是相同的。就是 說,不管是超類還是子類,不管是有沒有超類和子類的關係,只要名字相同那麼id就是一樣的。

1.sel變數名=@selector(方法名字);

2.sel變數名=nsselectorfromstring(方法名字的字串);

3.nsstring*變數名=nsstringfromselector(sel引數);

其中第1行是直接在程式裡面寫上方法的名字,第2行是寫上方法名字的字串,第3行是通過sel變數獲得方法的名字。我們得到了sel變數之後,可以通過下面的呼叫來給乙個物件傳送訊息:

[物件performselector:sel變數withobject:引數1withobject:引數2];

這樣的機制大大的增加了我們的程式的靈活性,我們可以通過給乙個方法傳遞sel引數,讓這個方法動態的執行某乙個方法;我們也可以通過配置檔案指定需要執行的方法,程式讀取配置檔案之後把方法的字串翻譯成為sel變數然後給相應的物件傳送這個訊息。

從效率的角度上來說,執行的時候不是通過方法名字而是方法id也就是乙個整數來查詢方法,由於整數的查詢和匹配比字串要快得多,所以這樣可以在某種程度上提高執行的效率。

這裡我講一下selector多引數的問題

@inte***censobject(moreselctorparam)

-(id)performselector:(sel)aselectorwithobjects:(nsarray*)objects;

@end

@implementationnsobject(moreselctorparam)

-(id)performselector:(sel)selectorwithobjects:(nsarray*)objects

[invocationretainarguments];//防止被釋放

[invocationinvoke];//呼叫

//有返回值

if(signature.methodreturnlength)

else

}else//不成功

}@end

問題就出現了不知道你們注意沒有?

-(void)printint:(int)istring:(nsstring*)s;

-(void)printint:(nsinteger)istring:(nsstring*)s;

-(void)printint:(id)istring:(nsstring*)s;

[objperformselector:@selector(printint:string:)withobjects:[nsarrayarraywithobjects:[[nsnumberalloc]initwithint:5],@"thisstring",nil]];

前2個結果為i->151608432,s->thisstring

後乙個結果為i->5,s->thisstring

所以你就把引數型別寫成id吧!原因啊,我也不知道!

對於objective-c裡面的類的例項變數而言,在編譯器的範圍裡面,是有作用域的。和其他的語言一樣,objective-c也支援public,private還有protected作用域限定。

如果乙個例項變數沒有任何的作用域限定的話,那麼預設就是protected。

如果乙個例項變數適用於public作用域限定,那麼這個例項變數對於這個類的派生類,還有類外的訪問都是允許的。

如果乙個例項變數適用於private作用域限定,那麼僅僅在這個類裡面才可以訪問這個變數。

如果乙個例項變數適用於protected作用域限定,那麼在這個類裡面和這個類的派生類裡面可以訪問這個變數,在類外的訪問是不推薦的。

前置加號(+)的方法為類方法,這類方法是可以直接用類名來呼叫的,它的作用主要是建立乙個例項。

前置減號(-)的方法為例項方法,必須使用類的例項才可以呼叫的。

和其他的語言類似,下面是類方法的一些規則,請大家務必記住。

1,類方法可以呼叫類方法。

2,類方法不可以呼叫例項方法,但是類方法可以通過建立物件來訪問例項方法。

3,類方法不可以使用例項變數。類方法可以使用self,因為self不是例項變數。

4,類方法作為訊息,可以被傳送到類或者物件裡面去(實際上,就是可以通過類或者物件呼叫類方法的意思)。

iOS基礎整理 常用小功能

出來上班這麼久了,發現之前好多東西都忘記了,現在開始重新整理一下!方法1 最簡單最粗暴的方法 直接跳轉到撥號介面 nsurl url nsurl urlwithstring tel 10000 缺點 不會自動返回到聯絡歷史介面 方法2 會詢問使用者是否撥打 結束之後會返回到之前介面 nsurl ur...

iOS開發整理

一,變數命名部分 基礎要求 1,小駝峰原則,如 nsstring foobar 2,變數是個名詞 以乙個有意義的名詞結尾 錯誤 nsstring nameforrole 正確 nsstring rolename 這裡表達同乙個意思,沒必要夾乙個介詞。3,變數應該說明它是什麼 錯誤 nsarray d...

ios 呼叫webservice整理

學iphone開發有一段時間了,對於我這個新手來說,學習過程中,遇到不少問題,尤其是webservice的呼叫一直困擾了很久,趕在光棍前夕之跡,談談個人在webservice方面遇到的問題以及解決方案 跟大家分享一下,對於那些高手來說可以略過 也不知道這是人生中的第幾個光棍節了,沒有妹子,很糾結,沒...