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] Student的age是100
四、點語法
#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;
}