做flash開發一枚,因為ANE等各種發展問題,決定再投資自己學習IOS開發。
IOS開發,目的其一:ANE,目的其二:興趣。
資料準備: 也準備了英文版本,怕臨時翻譯問題。
裝置:apple air iphone 4s ipad2 各一台。
Objective-C基礎教程1-6章節
ective-C基礎教程1-6章後,對一些東西的筆記,並不是完整的教程,只是類似拾遺,將一些不同的,不熟悉的東西記下來
一切都源於Hello World 恒古不變的定律,熟悉一門語言結構最快也就是這個萬能的程式了,Objective-C副檔名為.m(之後書中也有提到.mm就是C++風格)
Objective-c代碼
- #import <Foundation/Foundation.h>
- int main(int argc, const char *argv[]){
- NSLog(@"Hello Objective-C");
- return (0);
- }
其中NSLog方法是Objective-C專屬的一種類型,所有cocoa的對象都被冠以了NS首碼,作為區分。傳入的參數@""表示字串作為NSString被處理,程式其餘部分和C類似,#import的含義也不言而喻
布爾值
Objective-C中的布爾變數有些許小的不同,參數類型為BOOL,值為YES/NO,其中YES為1,NO為0,佔8位
需要注意的是,如果將一個int,short這樣的值賦給BOOL,只有低位位元組會發揮作用,這是特別要注意的,因為這意味著,並不是傳統認為的,非零即為true
Objective-C中有一種特有的文法:[對象 操作] 這在之後會一直看到
關於Objective-C中的OOP
@interface
Objective-c代碼
- @interface Circle:NSObject
- {
- ShapeColor color;
- ShapeRect bounds;
- }
- -(void) setFillColor: (ShapeColor) color;
- -(void) setBounds: (ShapeRect) bounds;
- -(void) draw;
- @end
以上就是標準的一個@interface定義,應該很好理解,Circle含有2個變數color,bounds,擁有3個方法
特別注意方法的申明方式
(void) 表示傳回型別 之後是方法名及參數
draw方法不含參數 也不用:
對於多個參數的方法申明
-(void) setTire: (Tire *) tire atIndex:(int) index;(這裡的第二個參數看起來有些奇怪,但是在之後調用方法的過程中,atIndex會被用到)
Objective-C的方法調用使用了一種被稱為中綴符的東西
看一下分別調用無參,1參和多參的文法
Objective-c代碼
- [circle draw];
- [circle setFillColor:kRedColor];
- [car setTire:tire atIndex:2];<span> </span>
@implementation
與名字相同,實現,就是對@interface所申明內容的具體實現
Objective-c代碼
- @implementation
- -(void) setFillColor:(ShapeColor c)
- {
- color=c;
- }
- @end
這裡的color=c其實就相當於self.color=c(這裡我又要做類比了,目前的認識self就相當於java中的this指標)
有了@interface和@implementation之後,我們對一個類(對象)的定義就算完成,那麼如何執行個體化一個對象呢
Objective-c代碼
- id shapes[3];
- shapes[0]=[Circle new];
- [shpaes[0] setBounds:rect];
- ...
這裡又看到一個新的東西id,它是一種指向某個對象的指標,目前為止只是看到這一種用法,也沒有太多認識,簡單的被我理解成了索引
之後看到了new對象的方法[Circle new],再之後是調用對象的方法設定具體的參數
繼承
Objective-c代碼
- @interface Circle:Shape
很簡單的方法,Objective-C在繼承規則上於java,C#無異,不允許多重繼承,不過既然有介面(或者應該叫協議),那麼自然同java一樣,達到相同的目的自然不難,同樣的,子類可以調用父類的方法,通過super,比如[super setColor:c];
Ojbective-C中的空值為nil
接下來 來看一個Car是被如何自動構建的
Objective-c代碼
- @implementation Car
- -(id) init
- {
- if(self=[super init]){
- engine=[Engine new];
- ...
- }
- return (self);
- }
這一段有些理解不能,在書中的注釋中說到,這裡指如果超類可以完成所需的一次性初始化,需要調用[super init]。init方法的傳回值id描述了倍初始化的對象。將[super init]的結果賦給self是Objective-C的標準慣例。
Objective-C中一樣有getter/setter方法,但是在命名規則上需要注意
Objective-c代碼
- -(Engine *)engine;
- -(void) setEngine: (Engine *) engine;
在set方法中 依然採取setXXX的方式 但是get方法則直接採用XXX 而非getXXX,以免混淆
拆分
一般將@interface部分放入.h檔案中
Objective-c代碼
- #import <Cocoa/Cocoa.h>
- @interface Tire:NSObject
- @end
將其他部分放在.m中,在.m中記得引入該標頭檔
#import "Tire.h"
import下<>代表系統標頭檔 ""代表本地標頭檔
關鍵詞@class 告訴編譯器此處是一個類,還需要通過指標進行傳遞
Objective-c代碼
- @class Tire
- @class Engine
- ...
- Engine *engine
注意這只有在通過指標指向其他類的情況下可用,減少編譯器負擔,在繼承的情況下不可用,因為他需要瞭解超類的資訊
推薦oc視頻教程:http://www.youku.com/playlist_show/id_4545842.html