剛接觸 iOS
開發,做爲菜鳥,感受知識點是很多的,有必要進行整理。這裏暫時只說針對iPhone的開發吧,iWatch神馬的……html
先說Objective-C
吧,雖然Apple發佈了Swift
,不過在2.0
版本或者更穩定的版本發佈以前,仍是老老實實學OC
吧。java
在官網或Mac App Store下載XCode就好了,感受不像安卓那樣麻煩,一切都配置好了,略去不講。若是新建Project,會左側邊欄發現有iOS和OS X兩種類型的app能夠建立。左側不少不明覺厲的東西。若是純粹要練習OC
基礎,能夠選擇建立Command Line Tool
,若是建立單頁應用能夠選擇Single Page App
,等等。python
按照我我的的理解,Cocoa之於iOS/OS X就至關於.NET Framework之於Windows。Cocoa裏有兩個框架對於iOS開發來講很是重要:Foundation Kit
和 UIKit
,若是是構建OS X Application
,你還須要用到AppKit
。ios
Foundation Kit
是後二者的基礎:它提供了Objective-C
不少基礎的類型。而Foundation
又是基於CoreFoundation
的,這是用純C語言寫的框架。git
若是你在編程中看到類型名、方法名、對象名以NS
前綴(如NSString
類型),那麼它就是存在於Foundation
中,若是以CF
爲前綴,它就存在於CoreFoundation
中。參考下圖:github
說得不太清楚,反正之後都會接觸到,你能夠不用在乎這些細節。objective-c
OC
只是在C
的基礎上進行了一些擴展,所以,OC
是能夠直接寫C
的方法的,有時候還能夠寫C++
,稱爲Objective-C++
。編程
按照慣例了來一段:api
// main.m #import <Foundation/Foundation.h> int main(int argc,const char *argv[]) { @autoreleasepool{ NSLog(@"Hello,World!"); } return (0); }
分析:app
OC文件不是保存爲*.c
而是保存爲*.m
格式的,頭文件擴展名則不變。
首先要導入 Foundation.h
,也就是前文中提到的Foundation Kit框架的頭文件。但它使用了關鍵字import
而不是咱們熟知的include
,前者能夠防止重複引用問題,後者則須要一些宏代碼配合。若是須要導入的文件在Cocoa中,則用<>
,若是在項目中,用""
。
入口程序:main
,argc argv
爲啓動時接受的命令行參數,這個不用多說。
@autoreleasepool
內存「自動釋放池」,在這個「池子」裏,系統能夠自動爲建立的對象分配或移除內存,與這個有關的知識是內存管理和自動引用計數。
NSLog
命令行的打印方法,使用起來和printf
差很少。
@"Hello,World!"
,前面加@
表明這是一個Objective-C字符串(NSString
類型),若是不加則和普通C字符串無異。但99%的狀況下,咱們使用NSString
。
@
這個字符在OC開發中很是常見,它表明這是一個OC語法。
在OC中,定義一個類,分爲定義類的接口和實現類兩個部分,而且前者每每在.h
文件中,後者每每在.m
文件中,要將二者相關聯,還須要後者import
前者。
想要實例化一個類,可使用new
關鍵字或結合使用alloc init
,貌似後者用的多一些。關於兩者的區別以及爲毛不推薦使用new
,請看這裏。
而後說方法,哎算了,直接上代碼吧:
定義一個「學生」類,以及實例化出一個「小明」,python
是這麼寫的:
class Student(object): BELONG = "High School" # 構造方法 def __init__(self,name): self.name = name; # 實例屬性 self.score = 0 # 實例方法 def doHomework(self,homework,speed): print 'doing' + homework + ' Homework' + speed + '...' def getScore(self): print "Score:" + str(self.score) return self.score def setScore(self,score): self.score = score # 類方法 @classmethod def getBlong(): print 'Belong : ' + Student.BELONG #構造一個小明 if __name__ == '__main__': xiaoming = Student("XiaoMing") xiaoming.doHomework('Math','Fast') # doingMath Homework... xiaoming.setScore(95) xiaoming.getScore()
再用java
:
public class Student { static String belong = "High School"; private int score = 0; private String name; // 構造方法 public Student(String name){ this.name =name; } // 實例方法 public void doHomework(String homework,String speed){ System.out.println("doing " + homework + " Homework " + speed +"..."); } public int getScore(){ System.out.println(Integer.toString(this.score)); return score; } public void setScore(int score){ this.score = score; } // 類方法 static void getBelong(){ System.out.println("Belong: "+belong); } public static void main(String[] args){ Student xiaoming = new Student("xiaoming"); xiaoming.doHomework("Math","Fast"); xiaoming.setScore(95); xiaoming.getScore(); Student.getBelong(); } }
嗯,下面上Objective-C
//++++++++++++++++++++++++++ Student.h ++++++++++++++++++++++++++++ // 這裏定義接口,告訴.m文件須要實現哪些方法,但不是強制的。 // Student.h #import <Foundation/Foundation.h> @interface Student: NSObject { static NSString *belong; int score; NSString *name; } // 方法接口聲明,加號表明類方法,減號表明實例方法,括號裏是返回類型,冒號後是所需參數。 +(void) getBelong; -(NSString *) name; -(void) initWithName:(NSString *) newName WithScore:(int) newScore; // 初始化方法。 -(void) setName:(NSString *) newName; -(NSString *) name; // getName 方法,OC中getter方法通常不寫get -(void) setScore:(int) newScore; -(int) score; // getScore 方法,OC中getter方法通常不寫get -(void) doHomework:(NSString *) homework WithSpeed:(NSString *) speed; @end
而後是m文件:
//++++++++++++++++++++++++++ Student.m ++++++++++++++++++++++++++++ #import "Student.h" // interface @interface Student: NSObject @end // ----------------- // implementation @implementation Student { static NSString *belong = @"High School"; int score = 0; NSString *name; } +(void) getBelong{ NSLog(@"Belong: %@",belong); } -(void) initWithName:(NSString *) newName WithScore:(int) newScore{ self.name = newName; self.score = newScore; } -(void) setName:(NSString *) newName{ self.name = newName; } -(NSString *) name{ NSLog(@"My Name is %@",self.name); return name; } -(void) setScore:(int) newScore{ self.score = newScore; } -(int) score{ NSLog(@"My Name is %i",self.core); return self.score; } -(void) doHomework:(NSString *) homework WithSpeed:(NSString *) speed{ NSLog(@"doing %@ Homework %@",homework,speed); } @end
而後是main文件:
//++++++++++++++++++++++++++ main.m ++++++++++++++++++++++++++++ #import <Foundation/Foundation.h> #import "Student.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *xiaoming = [[Student alloc] init]; /* OC的內存管理機制和.net或java的全自動內存回收不一樣,它大多數時候都須要手動管理。 alloc大體意思是給對象分配內存。init顧名思義是完成初始化。上述代碼也能夠寫做: Student *xiaoming = [Student new]; */ [xiaoming initWithName:@"Xiaoming" WithScore:95]; /* 注意,這裏的方括號調用類或對象的方法,固然有時候也能夠用點語法,但這裏不行。 OC裏不推薦直接給對象的屬性賦值,而是給定義getter和setter方法。 固然OC也提供了給屬性直接賦值的語法,例如: xiaoming->name = @"Xiaoming"; 固然,每給對象定義一個屬性,而且你須要讀寫它時,都須要給其定義getter或setter 方法,這太累了,OC2.0爲其增長了 @property 語法,能夠極大地節省勞動。 */ [xiaoming doHomework:@"Math" WithSpeed:@"Fast"]; /* 前面定義方法時也許你就注意到了: 方法名是能夠被拆開的,方法名寫到一半,傳個參數,再寫到一半,再傳參數。 這種奇葩設計的優勢是(對於英語好的童鞋)方法是作什麼的一目瞭然; 缺點是方法名太特麼長了,記不住啊! 至關於java或py的: xiaoming.initWithNameWithScore("Xiaoming",95); */ } return 0; }
什麼破玩意,媽淡想死了!
推薦文檔:
Objective-C 編程語言官網文檔翻譯
Start Developing iOS Apps Today
OC的 Kids Coding
蘋果官方的示例代碼