學習Objective-C,objectivec學習視頻

來源:互聯網
上載者:User

學習Objective-C,objectivec學習視頻
1. Objective-C與其他語言的區別?

我們知道Objective-C語言是有Smalltalk演化過來的,Smalltalk又他媽是訊息語言的鼻祖,可想而之Objective-C又有什麼樣的特性,Smalltalk的精髓是訊息結構叫做message structure的東西,而C++, java 等語言使用函數調用的方式(function call),也許不是很明白,也許你已經很透徹,但是我還是要舉個列子說明一下。

拿C++來說吧, 我們調用一個類名為Object字為function的函數通常會這樣做.

Object *obj = new object();obj->function();

而在Objective-C中是這種方式

Object *obj = [[Object alloc] init];[obj function];

上述兩種方式出了文法不一樣外,他們機制也有很大的區別,首先說C++ 如果函數function 是多態的,那麼程式啟動並執行時候,就會產生一張虛表,簡單的說虛表吧,就是一張表,呵呵,它儲存著自己的虛函數地址,同樣衍生類別也會產生一張虛表,如果衍生類別中實現了基類的虛方法的時候,衍生類別的函數地址紀錄的就是自己的函數地址,否則還是基類的,於是呼,當調用function的時候它會查自己的虛表找出function的函數地址進行調用,這是C++中調用原理。下面說下Objective-C中的方式,在OC中調用function的時候,那麼它會給這個對象發一個function的訊息,要理解的是只有啟動並執行時候該對象才接受接受到這個訊息進行調用,和編譯器半毛錢的關係都沒有,如果找不到這個方法就會爆出異常,OC中這種機制叫做動態綁定。在Effective 高品質編程這本書中說過這樣一句話對於訊息結構的語言,其運行時所執行的代碼由運行環境來決定,而函數調用的語言由編譯器來決定。後邊我會補充動態綁定的原理,這裡就不多說了。

2.Objective-C中對象記憶體的分配

碼奴們都很清楚程式運行時,變數的空間分配
靜態區:儲存自動全域變數和static 變數(包括static 全域和局部變數)。靜態區的內容在總個程式的生命週期內都存在,由編譯器在編譯的時候分配。
棧:儲存局部變數。棧上的內容只在函數的範圍記憶體在,當函數運行結束,這些內容也會自動被銷毀。
堆:由malloc 系列函數或new 操作符分配的記憶體。其生命週期由free 或delete 決定

那麼Objective-C有個引用計數以後,粗俗的來講,可以理解含有*對象都是在堆上,這裡先記下,我會在引用計數原理詳細的說明。

3.標頭檔的引用

Objective-C較語言加入了#import,而C語言中的#include同樣可以使用,#import比起#include的好處就是不會引起交叉編譯。因此建議使用#import這種方式。

4.第一個Objective-C程式

windows下編程我們經常用VS,那麼我們寫OC程式的時候用的是Xcode一個強大的到爆的ide工具。
先瞭解一下xcode的吧,我選用的是xcode版本6.3.1


我們選擇第二項Create a new Xcode project,至於其他兩項幹什麼的先不需要瞭解,後面會說到。

可以看到左邊的菜單有兩項IOS和IOX,IOS就是行動裝置 App,IOX是Mac X下的應用程式,這裡由於我門需要學習一些基礎資料型別 (Elementary Data Type),選擇OSX 下面的 Command Line Tool,就像我們學C語言的hello word

Product Name 顧名思義產品名字也就是工程的名字,下面兩項是組織的名字,在公司開發的時候一般一般填寫公司名字和網域名稱反轉bundle identifer是程式的標示,它會根據orgianization identifier和工程名自動產生,會在app store上線的時候用到。

好的那麼建立好之後就會自動產生helloword 程式

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {    @autoreleasepool {        // insert code here...        NSLog(@"Hello, World!");    }    return 0;}

那麼我們C語言的helloword 是什麼樣子的呢

#include<stdio.h>int main(int argc, const char * argv[]) {    printf("hello word");    return 0;}

是不是很像,第一章就說了Objective-C是C語言物件導向的擴充,
區別就是標頭檔和main 函數主題有點區別
OC 裡面有個架構叫做Foundation架構,在第一章我門已經說過IOS程式的分層,那麼這個Foundation就在Core Services 這一層,OC中含有大量的對象和資料結構,在Foundation中定義了大量我們日常用的資料結構,於是就引用和Foundation的標頭檔

@autoreleasepool {        // insert code here...    }

那麼上面這個代碼塊是幹什麼用的呢,我們稱它為自動釋放池,有了引用計數之後,我們不需要去考慮管理記憶體的事,它的功能就是延遲釋放,說白了就是保證對象用的時候可以用,不用的時候自動給你釋放,這裡會在附錄中的引用計數原理的詳細的講到。那麼以後寫代碼只需要寫在這個代碼塊裡面。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.