oc基礎語法小結
阿新 • • 發佈:2019-02-01
原文:http://blog.sina.com.cn/s/blog_b6e3f371010198za.html原文:
這篇博文比較簡潔,到位.但interface部分講解仍然不是很清楚。
第一節總括
這一節是對Objective-C(以後簡稱OC)的簡要介紹,目的是使讀者對OC有一個概括的認識。
1.面象的讀者
在閱讀本文之前,應具備使用與C類似的程式語言(如C,C++,JAVA)的一些經驗,同時熟悉面向物件程式設計。
2.OC簡介
OC是以SmallTalk為基礎,建立在C語言之上,是C語言的超集。20世紀80年代早期由 Brad
J.Cox設計,2007年蘋果公司釋出了OC 2.0,並在iPhone上使用OC進行開發。
3.OC學習內容
學習的內容主要包括語法和Cocoa框架兩部分。本文主要對語法進行介紹。
4.IDE
編寫OC程式最主要的編譯環境是Xcode,它是蘋果官方提供的IDE,官網中的SDK包括Xcode,可以通過下載SDK來獲得它。但是Xcode只支援MacOSX,所以如果要在其它環境下編寫OC程式,要使用其它IDE。Linux/FreeBSD用GNUStep,Windows
NT5.x(2000,XP)要先安裝cywin或mingw,然後安裝GNUStep。同時僅僅通過文字編輯器 ,GCC的make工具也可以用於開發。
注:如果要使用到Cocoa的話,只能在Apple公司的Xcode上。
5.框架
OC程式設計中主要用到的框架是Cocoa,它是MacOS X中五大API之一,它由兩個不同的框架組成FoundationKit 和ApplicationKit。Foundation框架擁有100多個類,其中有很多有用的、面向資料的低階類和資料型別,如NSString,NSArray,NSEnumerator和NSNumber。ApplicationKit包含了所有的使用者介面物件和高階類。這些框架本文不做重點介紹,如果要深入瞭解可以去看Xcode自帶的文件。
6.特別之處
初次接觸OC時,會發現許多和其它語言不同的地方,會看到很多的+,-,[
,] ,@,NS等符號,這些符號在以後的程式設計中將經常看到,這部分內容在第二節中介紹。先熟悉一下OC的程式碼:
#import "ClassA.h"
#import
int main( int argc, const char *argv[] ) {
ClassA *c1 =
[[ClassA alloc] init];
ClassA *c2 =
[[ClassA alloc] init];
// print count
printf(
"ClassA count:
%i\n", [ClassA initCount]
);
ClassA *c3 =
[[ClassA alloc] init];
// print count again
printf( "ClassA count:
%i\n", [ClassA initCount] );
[c1 release];
[c2 release];
[c3 release];
return 0;
}
除了這些語言要素上的不同,OC也提供了一些很好的特性,如類別,扮演(Posing)等,這些在執行時的特性使得程式設計更加靈活。
7.優缺點
每一個語言都有其優缺點,OC也不例外,這就要求在選擇語言時權衡利弊。對於OC,只要善於利用它的優點,你會發現它是一個簡單,靈活,高效的語言。以下列舉了它的一些特點:
優點:類別、扮演(Posing)、動態型別、指標計算、彈性資訊傳遞、不是一個過度複雜的c衍生語言、可通過Objective-c++與c++結合
缺點:沒有名稱空間、沒有操作符過載、不像c++那樣複雜
第二節:對C的擴充套件
1.副檔名
OC是ANSI版本C的一個超集,它支援相同的C語言基本語法。與C一樣,檔案分為標頭檔案和原始檔,副檔名分別為.h和.m。如果要加入c++的語法,需要用到.mm,這裡不做介紹。
.h
標頭檔案。標頭檔案包涵類的定義、型別、方法以及常量的宣告
.m
原始檔。這個典型的副檔名用來定義原始檔,可以同時包含C和Objective-C的程式碼。
2.#import
在OC裡,包含標頭檔案有比#include更好的方法#import。它的使用和#include相同,並且可以保證你的程式只包含相同的標頭檔案一次。相當於#include+ #pragma once的組合。
例如要包含Foundation框架中的Foundation.h檔案,可以像下面這樣。
#import
注:每個框架有一個主的標頭檔案,只要包含了這個檔案,框架中的所有特性都可以被使用。
[email protected]符號
@符號是OC在C基礎上新加的特性之一。常見到的形式有@”字串”,%@ , @interface,@implement等。@”字串”表示引用的字串應該作為Cocoa的NSString元素來處理。@interface等則是對於C的擴充套件,是OC面向物件特性的體現。
注:這裡提一個小技巧,只要看到@符號,就可以認為它是對於C的一個擴充套件。
4.NSLog()
在OC中用的列印函式是NSLog(),因為OC是加了一點”特殊語料”的C語言,所以也可以用printf()但是NSLog()提供了一些特性,如時間戳,日期戳和自動加換行符等,用起來更方便,所以推薦使用NSLog()。下面是兩種輸出的對比。
使用NSLog()輸出任意物件的值時,都會使用%@格式說明。在使用這個說明符時,物件通過一個名為description的方法提供自己的NSLog()格式。
下面分別是使用NSLog()和使用printf()的相應輸出:
2010-10-15 14:54:21。426 10_15[1973:207] Hello World!
Hello World!
注:NS字首告訴你函式來自Cocoa而不是其他工具包。
5.BOOL
BOOL是OC中的布林型別,它和C中的bool有如下區別
BOOL
YES(1),NO(0)
bool
true(!0),false(0)
6.id
這是OC新加的一個數據型別,它是一般的物件型別,能夠儲存任何型別的方法。
7.nil
在OC中,相對於C中的NULL,用的是nil。這兩者是等價的。下面是nil的定義。
#define nil NULL
第三節:建立物件
1.介面和實現
在OC中定義一個類需要有兩個部分:介面和實現。介面檔案包含了類的宣告,定義了例項變數和方法。實現檔案包含了具體的函式的實現程式碼。下圖顯示了一個叫 MyClass的類,它繼承自NSObject基類。類的定義總是從@interface開始到@end結束。在類名後面的是父類的名稱。例項變數被定義 在兩個花括號之間。在例項變數下面的是方法的定義。一個分號用來結束一個變數或者方法。
下面的程式碼顯示了MyClass這個類的實現程式碼。就像類的定義規則一樣,類實現檔案也被兩個標識框起來,一個是 @implementation,還有一個是@end。這兩個指令識別符號告訴編譯器程式從哪裡開始編譯到哪裡結束。類中的方法名稱的定義和它介面檔案中的 定義是一樣的,除了實現檔案中有具體的程式碼以外。
@implementation MyClass
- (id)initWithString:(NSString *) aName
{
if (self = [super init])
{
count count
= 0;
data =
nil;
name =
[aName copy];
return self;
}
}
+ (MyClass *)createMyClassWithString: (NSString *) aName
{
return [[[self alloc]
initWithString:aName] autorelease];
}
@end
當你要把一個物件儲存進變數,要使用指標型別。OC同時支援強和弱變數物件。強型別物件在變數型別定義的時候包含了類名。弱物件使用id型別作為例項變數。下面的例子同時顯示了定義MyClass中的強弱兩種型別的變數
MyClass* myObject1; //
Strong typing
id myObject2;
// Weak typing
2.方法
一個方法定義包含了方法型別,返回型別,一個或者多個關鍵詞,引數型別和引數名。在OC中一個類中的方法有兩種型別:例項方法,類方法。例項方法前用(-)號表明,類方法用(+)表明,通過下圖可以看到,前面有一個(-)號,說明這是一個例項方法。
在OC中,呼叫一個方法相當於傳遞一個訊息,這裡的訊息指的是方法名和引數。所有的訊息的分派都是動態的,這個體現了OC的多型性。訊息呼叫的方式是使用方括號。如下面的例子中,向myArray物件傳送insertObject:atIndex:這個訊息。
[myArray insertObject:anObj atIndex:0];
這種訊息傳遞允許巢狀
[[myAppObject getArray] insertObject:[myAppObject getObjectToInsert]
atIndex:0];
前面的例子都是把訊息傳遞給例項變數,你也可以把訊息傳遞給類本身。這時要用類方法來替代例項方法 。你可以 把他想象成靜態C++類(當然不完全相同)。
類方法的定義只有一個不一樣那就是用加號(+)代替減號(-)。下面就是使用一個類方法。
NSMutableArray* myArray = nil; //
nil is essentially the same as NULL
// Create a new array and assign it to the myArray variable.
myArray = [NSMutableArray arrayWithCapacity:0];
3.屬性
屬性提供了比方法更方便的訪問方式。通過property識別符號來替代getter和setter方法。使用方法就是在類介面檔案中用@property識別符號,後面跟著變數的屬性,包括 copy, tetain, assign ,readonly , readwrite,nonatomic,然後是變數名。同時在實現檔案中用@synthesize識別符號來取代getter和setter方法。
@property BOOL flag;
@property (copy) NSString* nameObject;
// Copy the object during assignment.
@property (readonly) UIView* rootView; //
Create only a getter method
介面檔案中使用@property
@synthesize flag,nameObject,rootView;
實現檔案中使用@synthesize
屬性的另一個好處就是,可以使用點(.)語法來訪問,如下所示:
myObject.flag = YES;
CGRect viewFrame = myObject.rootView.frame;
第四節:繼承
繼承的語法如下,冒號後的識別符號是需要繼承的類。
@interface Circle : NSObject
1.不支援多繼承
要注意的是OC只支援單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現,這兩種方法將在後面進行介紹。
2.Super關鍵字
OC提供某種方式來重寫方法,並且仍然呼叫超類的實現方式。當需要超類實現自身的功能,同時在前面或後面執行某些額外的工作時,這種機制非常有用。為了呼叫繼承方法的實現,需要使用super作為方法呼叫的目標。下面是程式碼示例:
@implementation Circle
-(void)setFill