Objective-c基礎知識學習筆記(一)
一直有記錄筆記的習慣,但很久沒分享一些東西了,正好上半年開始學習IOS了,現在有空寫點。因開發需要,公司特意為我們配置了幾臺新MAC,還讓我們自學了2周時間,就正式進入開發了。現在將自己了解的一些基礎知識分享一下。
一、開發工具
svn管理工具:versions(備注:個人感覺這個工具不是很好用,經常操作緩慢而且卡頓)、開發工具:xcode
二、IOS系統架構
IOS是基于UNIX內核,Android是基于Linux內核。
IOS的系統架構分為四個層次,從下到上依次是:核心操作系統層(Core OS layer)、核心服務層(Core Services layer)、媒體層(Media layer)和可觸摸層(Cocoa Touch layer)。
1、Core OS是位于iOS系統架構最下面的一層,是核心操作系統層,它包括內存管理、文件系統、電源管理以及一些其他的操作系統任務,可以直接和硬件設備進行交互。作為app開發者不需要與這一層打交道。
2、Core Services是核心服務層,可以通過它來訪問iOS的一些服務。
3、Media是媒體層,通過它我們可以在應用程序中使用各種媒體文件,進行音頻與視頻的錄制,圖形的繪制,以及制作基礎的動畫效果。
4、Cocoa Touch是可觸摸層,這一層為我們的應用程序開發提供了各種有用的框架,并且大部分與用戶界面有關,本質上來說它負責用戶在iOS設備上的觸摸交互操作。
三、重要后綴說明
.h后綴的文件指頭文件,描述類、類的數據成分以及類的方法,相當于接口。
.m后綴的文件是實現文件(源文件)
.xib后綴文件,是interface builder文件,存放應用程序的用戶界面(UI)
四、基礎語法
Objective c是面向對象的
1、#import(引入頭文件)語法
eg:#import<Foundation/Foundation.sh>
#import"SelfClass.h"
@classSelfClass
備注:<>只在系統文件中查找,””先在本地查找,沒找到則到系統文件中查找,import可自動防止同一個文件被導入多次。實例變量類型一般用@class引入,這個可以縮短編譯時間,一般用在interface中,里面的方法和變量不可用。
2、字符串NSString
@"字符串"
3、BOOL布爾類型
有YES和NO兩個值,備注:大于0的數不一定是YES。
4、控制臺輸出NSLog()
%@輸出NSString等對象的值
五、類的定義與實現
1、@interface用于定義接口類
接口一般在.h文件(頭文件)中定義,用來展示類的構造。
Eg:定義基于NSObject類的Circle類
@interfaceCircle :NSObject
{
ShapeColor *fillColor;
}
-(void) draw;
-(void)setFillColor: (ShapeColor *) fillColor secondName:(int) index;
@end
1)、大括號內的變量為類的實例變量(只在對象的實例中有效,所以稱為實例變量ivar),后面的為方法聲明。備注:c函數原型中沒有先行短線。
2)、方法返回類型與C函數有相同的類型:標準類型(整型、浮點型、字符串)、指針、引用對象和結構體,如果方法使用參數則需要冒號,否則不需要冒號。沒有聲明實例變量時,無需大括號。
3)、上面多參數方法定義,也可以不需要secondName,但不推薦這樣使用。
4)、有些方法的聲明是先行加號,這樣的方法為類方法(class method),這個方法屬于類對象(而不是類的實例對象),類似于靜態方法,通常用于創建新的實例,我們稱這種用來創建新對象的類方法為工廠方法。
5)、在對象類型的右邊都有一個*號,所有的對象變量都是指針類型。id類型(任意類型)已經被預定義為指針類型,所以不需要再加一個*號。
2、@implementation
實現類一般在.m文件(實現文件)中實現,實現了接口所聲明的所有方法。
Eg:上面Circle的實現類
@import “XXX.h”//引入上面定義的頭文件
@implementationCircle
- (void)setFillColor: (ShapeColor *) c
{
fillColor = c;
}
3、對象的實例化
1)、Circle *circle = [Circle new];//不建議這樣使用
2)、Circle *circle = [[Circle alloc]init];//一般這樣初始化
4、方法的調用
[ciclesetFillColor: kRedColor];//備注中間是空格
5、實例變量作用域的指令:
@protected實例變量可被該類及任何子類中定義的方法直接訪問(默認的情況)。
@private實例變量可被定義在該類的方法直接訪問,不能被子類定義的方法直接訪問。
@public實例變量可被該類中定義的方法直接訪問,也可被其他類或模塊中定義的方法訪問。使得其他方法或函數可以通過(->)來訪問實例變量(不推薦用)。
@package 對于64位圖像,可以在實現該類的圖像的任何地方訪問這個實例變量。
6、繼承
@interface Circle: NSObject
不支持多繼承,但Objective-C通過其它特性達到多繼承的效果,例如類別和協議。
7、復合(composition)
復合就好像音樂中的作曲一樣:將多個組件組合在一起,配合使用,從而得到完整的作品。嚴格來說,只有對象間的組合才能叫復合。
復合類之間的關系為“has a”。備注:在Objective-C中,復合是通過包含作為實例變量的對象指針實現的。
Eg:汽車有4個輪胎和一臺發動機。
@interface Car:NSObject
{
Engine *engine;
Tire *tire[4];
}
備注:為新建的Car對象分配內存時,這些指針將被初始化為nil(零值)
六、id
id shapes[2];
shapes[0] = [[Circlealloc]init];
shaoes[1] =[ [Egg alloc]init];
它是指向任意類型對象的指針,相當于范型。
七、存取方法名命名
1、setter方法需要在屬性名稱前增加set前綴,eg:setEngine
2、getter方法則是以其返回的屬性名稱來命名,eg:engine不要將get用作getter方法的前綴,例如方法getEngine違反了命名慣例,get這個詞在Cocoa中有特殊的含義,如果get出現在Cocoa的方法名中,就意味著這個方法將你傳的參數作為指針來返回數值。