iOS學習筆記之 Objective-C (一)

剛接觸 iOS 開發,做爲菜鳥,感受知識點是很多的,有必要進行整理。這裏暫時只說針對iPhone的開發吧,iWatch神馬的……html

工具和語言

先說Objective-C吧,雖然Apple發佈了Swift,不過在2.0版本或者更穩定的版本發佈以前,仍是老老實實學OC吧。java

使用官方的IDE——XCode

在官網或Mac App Store下載XCode就好了,感受不像安卓那樣麻煩,一切都配置好了,略去不講。若是新建Project,會左側邊欄發現有iOS和OS X兩種類型的app能夠建立。左側不少不明覺厲的東西。若是純粹要練習OC基礎,能夠選擇建立Command Line Tool,若是建立單頁應用能夠選擇Single Page App,等等。python

什麼是Cocoa?

按照我我的的理解,Cocoa之於iOS/OS X就至關於.NET Framework之於Windows。Cocoa裏有兩個框架對於iOS開發來講很是重要:Foundation KitUIKit,若是是構建OS X Application,你還須要用到AppKitios

Foundation Kit是後二者的基礎:它提供了Objective-C不少基礎的類型。而Foundation又是基於CoreFoundation的,這是用純C語言寫的框架。git

若是你在編程中看到類型名、方法名、對象名以NS前綴(如NSString類型),那麼它就是存在於Foundation中,若是以CF爲前綴,它就存在於CoreFoundation中。參考下圖:github

1350459010_4309.jpg

說得不太清楚,反正之後都會接觸到,你能夠不用在乎這些細節。objective-c

Objective-C小試牛刀

OC只是在C的基礎上進行了一些擴展,所以,OC是能夠直接寫C的方法的,有時候還能夠寫C++,稱爲Objective-C++編程

Hello World

按照慣例了來一段:api

// main.m
#import <Foundation/Foundation.h>

int main(int argc,const char *argv[])
{

  @autoreleasepool{
    NSLog(@"Hello,World!");
  }

  return (0);
}

分析:app

  1. OC文件不是保存爲*.c而是保存爲*.m格式的,頭文件擴展名則不變。

  2. 首先要導入 Foundation.h,也就是前文中提到的Foundation Kit框架的頭文件。但它使用了關鍵字import而不是咱們熟知的include,前者能夠防止重複引用問題,後者則須要一些宏代碼配合。若是須要導入的文件在Cocoa中,則用<>,若是在項目中,用""

  3. 入口程序:mainargc argv爲啓動時接受的命令行參數,這個不用多說。

  4. @autoreleasepool內存「自動釋放池」,在這個「池子」裏,系統能夠自動爲建立的對象分配或移除內存,與這個有關的知識是內存管理和自動引用計數。

  5. NSLog命令行的打印方法,使用起來和printf 差很少。

  6. @"Hello,World!",前面加@表明這是一個Objective-C字符串(NSString類型),若是不加則和普通C字符串無異。但99%的狀況下,咱們使用NSString

  7. @這個字符在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
蘋果官方的示例代碼

相關文章
相關標籤/搜索