XCode、Objective-C、Cocoa 說的是幾樣東西

大部分有一點其他平臺開發基礎的初學者看到XCode,第一感想是磨拳擦掌,看到 Interface Builder之后,第一感想是躍躍欲試,而看到Objective-C的語法,第一感想就變成就望而卻步了。好吧,我是在說我自己。

如果你和我一樣,對蘋果相關的開發:Mac OS X或是iPhone有興趣,但是第一時間看到Objective-C就會頭疼并伴有發燒癥狀的話,療效比較好的快速治療方法是閱讀本文。大概花二十分鐘左右,而且絕不無聊的時間,你就會對Objective-C有那么一點點了解,至少讀讀例子不會那么頭疼了。

不過假定你要有那么一點點c++、c#或是java的基礎,至少能看到c++、c#或是 java的源碼,能夠大致明白說得是什么。

這篇文章不是一篇科技文章,希望你也不要把它當做科技文章來讀。文章非常不嚴謹,但是我相信你能看得懂。

一、XCode、Objective-C、Cocoa 說的是幾樣東西?

答案:三樣東西。

XCode:你可以把它看成是一個開發環境,就好像Visual Studio或者Netbeans或者SharpDevelop一樣的玩意。你可以將Interface Builder認為是Visual Studio中用來畫界面的那部分功能單獨提出來的程序。

Objective-C:這是一種語言,就好像c++是一種語言,Java是一種語言,c#是一種語言,鶯歌歷史也是一種語言一樣。

Cocoa:是一大堆函數庫,就好像MFC、.NET、Swing這類玩意,人家已經寫好了一堆現成的東西,你只要知道怎么用就可以了。

有些人會比較容易混淆Objective-C和Cocoa,就好像有些人會混淆c#和.NET一樣。這兩個東西真的是兩個不一樣的東西。

二、Objective-C是什么?

你可以把它認為是語法稍稍有點不一樣的c語言。雖然第一眼望上去你可能會認為它是火星語,和你所認知的任何一種語言都不一樣。

先簡單列出一點差別:

問題一:我在程序中看到大量的減號、中括號和NS****這種東西,他們是什么玩意兒?

1 減號(或者加號)

減號表示一個函數、或者方法、或者消息的開始,怎么說都行。

比如c#中,一個方法的寫法可能是:

private void hello(bool ishello)

{

//OOXX

}

用Objective-C寫出來就是

-(void) hello:(BOOL)ishello

{

//OOXX

}

挺好懂的吧?

不過在Objective-C里面沒有public和private的概念,你可以認為全是public。

而用加號的意思就是其他函數可以直接調用這個類中的這個函數,而不用創建這個類的實例。

2 中括號

中括號可以認為是如何調用你剛才寫的這個方法,通常在Objective-C里說“消息”。

比如C#里你可以這么寫:

this.hello(true);

在Objective-C里,就要寫成:

[self hello:YES];

3 NS****

老喬當年被人擠兌出蘋果,自立門戶的時候做了個公司叫做NextStep,里面這一整套開發包很是讓一些科學家們喜歡,而現在Mac OS用的就是NextStep這一套函數庫。

這些開發NextStep的人們比較自戀地把函數庫里面所有的類都用NextStep的縮寫打頭命名,也就是NS****了。比較常見的比如:

NSLog

NSString

NSInteger

NSURL

NSImage

你會經常看到一些教學里面會用到:

NSLog (@”%d”,myInt);

這句話主要是在 console里面跟蹤使用,你會在console里面看到myInt的值(在XCode里面運行的時候打開dbg窗口即可看到)。而我們在其他開發環境里面可能會比較習慣使用MessageBox這種方式進行調試。

你還可以看到其他名字打頭的一些類,比如CF、CA、CG、UI等等,比如

CFStringTokenizer 這是個分詞的東東

CALayer 這表示Core Animation的層

CGPoint 這表示一個點

UIImage 這表示iPhone里面的圖片

CF說的是Core Foundation,CA說的是Core Animation,CG說的是Core Graphics,UI說的是iPhone的User Interface……還有很多別的,等你自己去發掘了。

問題二、#import、@interface這類玩意說的是什么?

1、#import

你可以把它認為是#include,一樣的。但是最好用#import,記住這個就行了。

2、@interface等等

比如你在c#中寫一個抓孩子類的定義:

public class Kids : System

{

private string kidName=”mykid”;

private string kidAge=“15”;

private bool isCaughtKid()

{

return true;

}

}

當然,上面的寫法不一定對,就是個用于看語法的舉例。

在Objective-C里就得這么寫:

先寫一個kids.h文件定義這個類:

@interface Kids: NSObject {

NSString *kidName;

NSString *kidAge;

}

-(BOOL) isCaughtKid:;

@end

再寫一個kids.m文件實現:

#import “kids.h”

@implementation Kids

-(void) init {

kidName=@”mykid”;

kidAge=@”15”;

}

-(BOOL) isCaughtKid:{

return YES;

}

@end

這個寫法也不一定對,主要是看看語法就行了。-_-b

問題三、一個方法如何傳遞多個參數?

一個方法可以包含多個參數,不過后面的參數都要寫名字。

多個參數的寫法

(方法的數據類型) 函數名: (參數1數據類型) 參數1的數值的名字 參數2的名字: (參數2數據類型) 參數2值的名字 …. ;

舉個例子,一個方法的定義:

-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;

實現這個函數的時候:

-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName{

大兒子 = myOldestKidName;

二兒子 = mySecondOldestKidName;

三兒子 = myThirdOldestKidName;

}

調用的時候:

Kids *myKids = [[Kids alloc] init];

[myKids setKids: @”張大力” secondKid: @”張二力” thirdKid: @”張小力”];

而如果你用c#寫這個方法,大致的寫法可能是

public void setKids( string myOldestKidName,?string mySecondOldestKidName,?string myThirdOldestKidName)

{

}

調用的時候大概的寫法可能是:

Kids myKids = new Kids();

myKids.setKids (“張大力”, “張二力”, “張小力”);

明白了吧?其實不怎么難看懂。

基本上,如果你能了解下面這段代碼的轉換關系,你Objective-C的語法也就懂了八成了:

[[[MyClass alloc]?init:[foo bar]] autorelease];
?

轉換成C#或者Java的語法也就是:

MyClass.alloc().init(foo.bar()).autorelease();

三、其他的一些東西

?

其實這些本站之前的文章有所提及,這里再詳細解釋一下。

1、 id:

Objective-C有一種比較特殊的數據類型是id。你可以把它理解為“隨便”。

在Objective-C里,一切東西都是指針形式保存,你獲取到的就是這個對象在內存的位置。那么id就是你知道這個位置,但是不知道里面是啥的時候的寫法。

2、 同一個數組可以保存不同的對象:

比如一個數組NSArray,這種數組里面可以保存各種不同的對象,比如這個數組里:

myArray <—-|

?? ? ? ? ? ? ? ? ? ? ? 0: (float) 234.33f

?? ? ? ? ? ? ? ? ? ? ? 1: @”我是個好人”

?? ? ? ? ? ? ? ? ? ? ? 2: (NSImage *)??(俺的美圖)

?? ? ? ? ? ? ? ? ? ? ? 3: @”我真的是好人”

這是一個由4個東西組成的數組,這個數組包括一個浮點數,兩個字符串和一個圖片。

3、BOOL,YES,NO:

你可以認為YES表示C#或者Java里的true,NO表示false。而實際上YES是1,NO是0,BOOL本身就是個char。

4、IBOutlet、IBAction是啥玩意,總能看到。

這兩個東西其實在語法中沒有太大的作用。如果你希望在Interface Builder中能看到這個控件對象,那么在定義的時候前面加上IBOutlet,在IB里就能看到這個對象的outlet,如果你希望在 Interface Builder里控制某個對象執行某些動作,就在方法前面加上(IBAction)。

而這兩個東西實際上和void是一樣的。

5、nil。

Objective-C里的NULL(空)就這么寫,表示空指針。

6、為什么是@”字符串”而不是”字符串”

前面加上@符號,編譯器在編譯的時候會在程序中給你留出位置,這樣才能保證這個字符串不會丟失。反正記住,如果你要想把某些字符串寫死在程序里,就要用@”字符串”,如果忘了用@,程序應該會出錯。

superzhou大俠指正:

6、為什么是@”字符串”而不是”字符串”

”字符串”是C的字符串,@””是把 C的字符串轉成NSString的一個簡寫.
在需要NSString的地方才需要這個轉化,例如NSLog里面.
在需要C string的地方,還是用”字符串”的.

另外,@””這個轉換是不支持中文的.例如NSLog(@”字符串”); 是一定輸出不了中文的.

四、Objective-C 2.0

Objective-C 2.0是Leopard新增加的一門語言,其實和原來的Objective-C是一樣的。主要是增加了屬性。詳細的內容這里不寫了,可以參閱Allen Dang的這篇文章,寫的很明白。

http://blog.codingmylife.com/?p=81

五、總結

?

現在來總結一下怎么看Objective-C的代碼和怎么開始學Objective-C吧。

1、記住Objective-C就是C,不是火星語,這個很關鍵。

2、記住你自己看不懂不表示腦子遲鈍,大部分人第一次看Objective-C的代碼可能比你還要遲鈍。

3、把CocoaChina.com加入收藏夾,看不明白代碼就來再看一遍這篇開宗明義的好文。

4、文檔很關鍵,當你看不懂某些東西說的是什么的時候,先查Cocoachina,再看英文文檔里面的API說明,尤其這個類是以NS開頭的時候。再不行就去google搜,直接把你要查的方法貼進google,通常能找到不少人也在問同樣的問題,自然也有熱心人活雷鋒幫助回答。

5、可以看hello world例子,但是不能總看,看多了真的會暈。另外,千萬要放棄蘋果官方的Currency Converter貨幣轉換的例子,那個例子是毒藥,剛學的時候越看越蒙。

6、學習一門語言最好的方法是先用,和學外語一樣,當你會說的時候自然會讀。給自己設立一個簡單的目標,比如做一個簡單的程序,然后一點點解決問題。這樣學習起來比只看例子快得多。

這是一篇初學者寫的文章,希望對同樣是初學者的你有一點點幫助:)雖然只是很膚淺的一點點內容,但是應該對你邁入Objective-C的大門有一點幫助。看懂了這篇文章,回過頭看Cocoachina的其他文章,你就會覺得很順眼了。記得天天來哦。

http://player.youku.com/player.php/sid/XMjQ4MTE3ODEy/v.swf

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388813.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java http2_探索HTTP/2: HTTP 2協議簡述(原)

探索HTTP/2: HTTP/2協議簡述HTTP/2的協議包含著兩個RFC&#xff1a;Hypertext Transfer Protocol Version 2 (RFC7540)&#xff0c;即HTTP/2&#xff1b;HPACK: Header Compression for HTTP/2 (RFC7541)&#xff0c;即HPACK。RFC7540描述了HTTP/2的語義&#xff0c;RFC7541則描…

錯誤處理

錯誤處理&#xff1a; 許多系統調用和函數在失敗后&#xff0c;會在失敗時設置外部變量errno的值來指明失敗原因。許多不同的函數庫都把這個變量作為報告錯誤的標準方法。程序必須在函數報告出錯后立刻檢查errno變量&#xff0c;因為它可能被下一個函數調用所覆蓋&#xff…

Android類庫介紹

Android類庫介紹 GPhone開發包Android SDK含了很多豐富的類庫&#xff1a; android.util 涉及系統底層的輔助類庫 android.os 提供了系統服務、消息傳輸、IPC管道 android.graphics GPhone圖形庫&#xff0c;包含了文本顯示、輸入輸出、文字樣式 android.database 包含底層的AP…

遞歸函數基例和鏈條_鏈條和叉子

遞歸函數基例和鏈條因果推論 (Causal Inference) This is the fifth post on the series we work our way through “Causal Inference In Statistics” a nice Primer co-authored by Judea Pearl himself.這是本系列的第五篇文章&#xff0c;我們通過“因果統計推斷”一書進行…

前端技能拾遺

本文主要是對自己前端知識遺漏點的總結和歸納&#xff0c;希望對大家有用&#xff0c;會持續更新的~ 解釋語言和編譯型語言 解釋型語言與編譯型語言的區別翻譯時間的不同。 編譯型語言在程序執行之前&#xff0c;有一個單獨的編譯過程&#xff0c;將程序翻譯成機器語言&#xf…

java lock 信號_java各種鎖(ReentrantLock,Semaphore,CountDownLatch)的實現原理

先放結論&#xff1a;主要是實現AbstractQueuedSynchronizer中進入和退出函數&#xff0c;控制不同的進入和退出條件&#xff0c;實現適用于各種場景下的鎖。JAVA中對于線程的同步提供了多種鎖機制&#xff0c;比較著名的有可重入鎖ReentrantLock&#xff0c;信號量機制Semapho…

Intent.ACTION_MAIN

1 Intent.ACTION_MAIN String: android.intent.action.MAIN 標識Activity為一個程序的開始。比較常用。 Input:nothing Output:nothing 例如&#xff1a; 1 <activity android:name".Main"android:label"string/app_name">2 <intent-filter…

足球預測_預測足球熱

足球預測By Aditya Pethe通過阿蒂亞皮特(Aditya Pethe) From September to January every year, football takes over America. Games dominate TV Sunday and Monday nights, and my brother tears his hair out each week over his consistently underperforming fantasy te…

C#的特性Attribute

一、什么是特性 特性是用于在運行時傳遞程序中各種元素&#xff08;比如類、方法、結構、枚舉、組件等&#xff09;的行為信息的聲明性標簽&#xff0c;這個標簽可以有多個。您可以通過使用特性向程序添加聲明性信息。一個聲明性標簽是通過放置在它所應用的元素前面的方括號&am…

java 技能鑒定_JAVA試題-技能鑒定

一、單選題1.以下創建了幾個對象( B)String A,B,CA"a";B"b":AAB;StringBuffer Dnew StringBuffer("abc");DD.append("567");A.6B.4C.3D.52.關于以下程序段&#xff0c;正確的說法是( C )1&#xff0e;String s1“a”“b”;2&#xff0…

ADD_SHORTCUT_ACTION

String ADD_SHORTCUT_ACTION 動作&#xff1a;在系統中添加一個快捷方式。. “android.intent.action.ADD_SHORTCUT”   String ALL_APPS_ACTION 動作&#xff1a;列舉所有可用的應用。   輸入&#xff1a;無。 “android.intent.action.ALL_APPS”   String ALTERNATIVE…

python3中樸素貝葉斯_貝葉斯統計:Python中從零開始的都會都市

python3中樸素貝葉斯你在這里 (You are here) If you’re reading this, odds are: (1) you’re interested in bayesian statistics but (2) you have no idea how Markov Chain Monte Carlo (MCMC) sampling methods work, and (3) you realize that all but the simplest, t…

java映射的概念_Java 反射 概念理解

文章來源:http://hollischuang.gitee.io/tobetopjavaer/#/basics/java-basic/reflection反射反射機制指的是程序在運行時能夠獲取自身的信息。在java中&#xff0c;只要給定類的名字&#xff0c;那么就可以通過反射機制來獲得類的所有屬性和方法。反射有什么作用在運行時判斷任…

【轉載】移動端布局概念總結

布局準備工作及布局思想及概念: 一個顯示器&#xff08;pc端顯示器 及 手機屏顯示器&#xff09;&#xff0c;既有物理像素&#xff0c;又有獨立像素&#xff08;獨立像素也叫作css像素&#xff0c;用于前端人員使用&#xff09;&#xff1b; -->重要 首先確定設計稿的尺寸…

深入淺出:HTTP/2

上篇文章深入淺出&#xff1a;5G和HTTP里給自己挖了一根深坑&#xff0c;說是要寫一篇關于HTTP/2的文章&#xff0c;今天來還賬了。 本文分為以下幾個部分&#xff1a; HTTP/2的背景HTTP/2的特點HTTP/2的協議分析HTTP/2的支持 HTTP/2簡介 HTTP/2主要是為了解決現HTTP 1.1性能不…

畫了個Android

畫了個Android 今晚瞎折騰&#xff0c;閑著沒事畫了個機器人——android&#xff0c;浪費了一個晚上的時間。畫這丫還真不容易&#xff0c;為那些坐標&#xff0c;差點砸了鍵盤&#xff0c;好在最后畫出個有模有樣的&#xff0c;心稍安。 下面來看看畫這么個機器人需要些什么東…

數據治理 主數據 元數據_我們對數據治理的誤解

數據治理 主數據 元數據Data governance is top of mind for many of my customers, particularly in light of GDPR, CCPA, COVID-19, and any number of other acronyms that speak to the increasing importance of data management when it comes to protecting user data.…

mysql 選擇前4個_mysql從4個表中選擇

不要認為GROUP BY是必需的 . 雖然如果一個孩子有2個父記錄&#xff0c;你可能想用它來將2個父母分組到一行 - 但不確定這是否是你的要求 . 因為如果一個孩子有2個父母&#xff0c;那么將為該孩子返回的父母是未定義的 .假設所有孩子都有父母&#xff0c;所有父母都會有姓&#…

提高機器學習質量的想法_如何提高機器學習的數據質量?

提高機器學習質量的想法The ultimate goal of every data scientist or Machine Learning evangelist is to create a better model with higher predictive accuracy. However, in the pursuit of fine-tuning hyperparameters or improving modeling algorithms, data might …

mysql 集群實踐_MySQL Cluster集群探索與實踐

MySQL集群是一種在無共享架構(SNA&#xff0c;Share Nothing Architecture)系統里應用內存數據庫集群的技術。這種無共享的架構可以使得系統使用低廉的硬件獲取高的可擴展性。MySQL集群是一種分布式設計&#xff0c;目標是要達到沒有任何單點故障點。因此&#xff0c;任何組成部…