1. 程式人生 > >Objective-C基礎筆記(1)基本概念和第一個程式

Objective-C基礎筆記(1)基本概念和第一個程式

一、基本概念

Objective-C(簡稱OC)是iOS開發的核心語言,蘋果公司在維護,在開發過程中也會配合著使用C語言、C++,OC主要負責UI介面,C語言、C++可用於圖形處理。C語言是面向過程的語言,OC是在C語言基礎上加上了一層面向物件的語法(將複雜面向物件語法去掉了)。我們可以使用OC開發Mac OS X平臺和IOS平臺的應用程式。

2014年10月程式語言排行榜(http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html)


從這個排行榜上可以看到,高居榜首的還是c、java、object-c、c++、c#、php、python、javascript.

注意:

1、Objective-C是沒有包的概念的,也就是沒有名稱空間機制,而是通過給類名新增字首來防止類名衝突。

2、Objective-C中的關鍵字以@開頭,防止和c/c++的關鍵字衝突。

3、Objective-C中的字串以@開頭。

語法:


需要注意的是上面的紅色字部分:

BOOL型別(YES\NO)其實就是1和0

nil相當於Java中的null

self相當於Java中的this

for(xx in xx)和javascript的快速遍歷相同,相當於java中的for...each

繼承和Java相同是單繼承

二、第一個OC程式


選擇命令列程式
選擇語言位Objective-C,建立好的工程如下:
//
//  main.m
//  firstOCProj
//
//  Created by lixiaoqiang on 14/11/11.
//  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}
控制檯輸出:

2014-11-11 23:44:36.052 firstOCProj[1649:99047] Hello, World!

上面的@autoreleasepool和記憶體管理有關,暫時不用管。#import  <Foundation/Foundation.h> : import和include的作用一樣,唯一區別是可以防止標頭檔案被重複包含。NSLog():向控制檯輸出日誌,相當於c語言中的printf(),和android中的Log

三、類的基本語法

OC中的類分為兩個檔案,一個是.h檔案,另一個是.m檔案(是OC檔案的字尾名).h : 類的宣告檔案,用於宣告成員變數和方法。.m : 實現.h中宣告的方法。新建Student.h和Student.m檔案,工程如下:

Student.h檔案
//
//  Student.h
//  firstOCProj
//
//  Created by lixiaoqiang on 14/11/11.
//  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
//
//該檔案只是用來宣告Student這個類有哪些成員變數和方法

//包含NSObject所在的標頭檔案
#import <Foundation/Foundation.h>
//@interface @end代表宣告一個類
//和Java不同的是OC中不能省略NSObject的預設繼承
// : 代表繼承
@interface Student : NSObject{
    //定義成員變數(必須定義在該括號內)
    int age;
}

//age的get方法
//如果是動態方法 -
//如果是靜態方法 + (-和+必須新增)
//OC中的引數型別都用括號括住
//.h檔案中的方法都是公共方法
- (int)age;

//age的set方法
//OC中一個 : 對應一個引數
- (void)setAge:(int)newAge;
@end
Student.m檔案
//
//  Student.m
//  firstOCProj
//
//  Created by lixiaoqiang on 14/11/11.
//  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
//
//自定義的標頭檔案使用雙引號
#import "Student.h"

@implementation Student

- (int)getAge {
    return age; //age在父類中
}

- (void)setAge:(int)newAge {
    age = newAge;
}

@end
main.m檔案
//
//  main.m
//  firstOCProj
//
//  Created by lixiaoqiang on 14/11/11.
//  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //建立一個Student物件
        //1、呼叫一個靜態方法alloc分配記憶體
        //OC 中通過類名呼叫方法 [類名 方法名]
        //[Student alloc]返回一個指標,在OC中stu稱為物件
        //這個其實和Java中的物件(this)是一樣的(引用)
        //Student *stu = [Student alloc];
        //2、呼叫一個動態方法init進行初始化
        //stu = [stu init];
        
        //連線起來使用
        Student *stu = [[Student alloc] init];
        [stu setAge:100];
        NSLog(@"呼叫了setAge方法");
        int age = [stu age];
        NSLog(@"Student的age是%i", age);
        //釋放物件
        //[stu release];
    }
    return 0;
}
執行結果:

2014-11-12 00:25:03.661 firstOCProj[1707:110472] 呼叫了setAge方法

2014-11-12 00:25:03.663 firstOCProj[1707:110472] Studentage100

四、點語法

#import <Foundation/Foundation.h>

@interface Person : NSObject{
    int _age;
    int _no;
}

- (void)setAge:(int)newAge;
- (int)age;

//注意: 方法名是setAge:andNo:
- (void)setAge:(int)newAge AndNo:(int)no;

@end
#import "Person.h"

@implementation Person

//方法名是setAge:  (冒號也是方法名的一部分)
- (void)setAge:(int)newAge {
    NSLog(@"呼叫了setAge方法:%i", newAge);
    _age = newAge;
}

//方法名是age
- (int)age {
    NSLog(@"呼叫了age方法");
    return _age;
}

@end
在Person類的實現裡面我們分別列印了兩個log用來判斷是否呼叫了該方法
#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        
        //方法一:
        //[person setAge:10];
        //int age = [person age];
        
        //方法二:(點語法)
        //OC中呼叫的成員方法,等效於[person age]
        person.age = 11;
        //等效於[person setAge:11]
        int age = person.age;
        
        NSLog(@"age is %i", age);
    }
    return 0;
}
輸出結果:

2014-11-12 20:03:55.718 firstOCProj[521:19414] 呼叫了setAge方法:11

2014-11-12 20:03:55.719 firstOCProj[521:19414] 呼叫了age方法

2014-11-12 20:03:55.720 firstOCProj[521:19414] age is 11


可以看到在OC中的點語法和Java中是不一樣的,person.age呼叫的是成員方法而不是變數。五、構造方法和%@
//
//  Person.m
//  firstOCProj
//
//  Created by lixiaoqiang on 14/11/12.
//  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)setAge:(int)age {
    _age = age;
}

- (int)age {
    return _age;
}

- (void)setNo:(int)no {
    _no = no;
}

- (int)no {
    return _no;
}

//實現構造方法

- (id)initWithAge:(int)age andNo:(int)no {
    //首先要呼叫super的構造方法
    if(self = [super init]){   //如果self不為nil
        self.age = age;
        self.no = no;
    }
    return self;
}

// 重寫父類的description方法
// 當使用%@列印一個物件的時候會呼叫
// NSString 是一個字串類
- (NSString *)description {
    return [NSString stringWithFormat:@"age is %i and no is %i", _age, _no];
}

@end
//
//  main.m
//  firstOCProj
//
//  Created by lixiaoqiang on 14/11/11.
//  Copyright (c) 2014年 lixiaoqiang. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] initWithAge:15 andNo:2];
        
        NSLog(@"age is %i and no is %i", person.age, person.no);
        
        //%@代表列印一個OC物件
        NSLog(@"%@", person);
    }
    return 0;
}