第一篇 Object-C快速入门
一、概述
Object-C是OS X和iOS上的主要程序開發(fā)語言。它是C語言的超集,提供了面向?qū)ο蠛蛣討B(tài)運行時(多態(tài))的功能。Object-C繼承了C語言的語法、基本類型和流程控制語句,同時添加了定義類和方法的語法。當(dāng)進(jìn)行動態(tài)類型識別和綁定的時候,Object-C還添加了對象結(jié)構(gòu)管理和對象語法的語言層面的支持,將很多工作延遲到了運行時進(jìn)行處理。
二、類的聲明與實現(xiàn)
Object-C類聲明,一般在一個獨立的頭文件中進(jìn)行,比如聲明一個名稱為yourClass的類的一般格式如下:
@Interface yourClass :NSObject ... @endNSObject是Object-C中所有類的根類,也就是說,所有類要么從它派生,要么從它的子類派生。但你一次只能從一個類派生,因為Object-C是單繼承的。yourClass類的實現(xiàn)一般在yourClass.m文件中,其一般格式為:
#import “yourClass.h“ @implementation yourClass ... @end#import,它類似C語言的#include。只不過,在Object-C中,它比#include更好用,它可以防止重復(fù)包含。也就說#inlcude依然可以使用,但#import更好。
三、屬性
1、屬性的聲明與修飾
屬性就是對象的數(shù)據(jù)。屬性使用@property關(guān)鍵字聲明。一般格式如下:
@property NSString *firstName; @property NSString *lastName;多個屬性之間,可以使用逗號分隔:
@property (strong, nonatomic) UIWindow *window;屬性通常還會加一些修飾,來控制數(shù)據(jù)的訪問和存儲等:
@property (readonly) NSString *firstName; @property (readonly) NSString *lastName;readonly與readwrite:
atomic與nonatomic:
(atomic、nonatomic)屬性用于多線程編程,屬性默認(rèn)是atomic的。在多線程環(huán)境下設(shè)置為atomic可以保證數(shù)據(jù)讀取的一致性(因為,它將保證數(shù)據(jù)僅僅被一個線程獨占。也就是說一個線程進(jìn)行寫操作時,將鎖定該屬性,不允許其他的線程進(jìn)行寫操作。)由于該操作會對數(shù)據(jù)進(jìn)行鎖操作,故會消耗較多的資源。所以在不需要進(jìn)行多線程操作時建議將該屬性設(shè)置為nonatomic,設(shè)置為該參數(shù)時程序在任何情況都不會鎖定該屬性。
strong與weak:
? 其中strong是默認(rèn)的。strong表示該屬性對其相應(yīng)的對象是強(qiáng)引用。一個變量保持對一個對象的強(qiáng)引用,只要該變量在其作用域范圍內(nèi)或者直到它被賦給另一個對象或者nil為止。weak表示對屬性對應(yīng)的對象的弱引用。
copy、assign、retain:
copy修飾表示該屬性將使用強(qiáng)引用,因為它必須保持它創(chuàng)建的新對象。
assign指定setter方法用簡單的賦值,不更改索引計數(shù)(Reference Counting),一般對簡單數(shù)據(jù)類型?使用assign。
2、屬性的存取方法
一般情況下,一旦你使用@property聲明了一個屬性,編譯器就會自動為該屬性生成一對存取方法。編譯器生成的存取方法遵守以下命名約定:
1)用來訪問屬性值的方法,getter方法,其名字與屬性的名字是相同的;
2)用來設(shè)置屬性值的方法,setter方法,其名字以“set”開始,其后是屬性名,屬性名首字母大寫;
屬性的修飾也會告訴編譯器如何生成相關(guān)的存取方法,對于readonly屬性,編譯器會生成getter方法,但不會生成setter方法。
你也可以為存取方法取一個你自己想要的名字:
@property (getter=isFinished) BOOL finished; @property (readonly, getter=isFinished)BOOL finished;除了明確調(diào)用存取方法之外,OC還提供了點語法,來訪問對象的屬性:
NSString *firstName = somePerson.firstName; somePerson.firstName = @"Johnny";點語法只是存取方法調(diào)用的一個便捷方式。當(dāng)你使用點語法的時候,屬性依然是通過getter或者setter方法來訪問或者改變的。
點語法訪問屬性,同樣要受到屬性修飾的約束。
3、屬性與實例變量
默認(rèn)地,一個可讀寫的屬性是基于一個實例變量的,這個實例變量也是編譯器自動生成的。
自動生成的實例變量與屬性的名字是相同的,但是多了一個下劃線前綴。
盡管一個對象通過存取方法或者點語法訪問自己的屬性是最佳做法,但是它也可以在類實現(xiàn)中的,任何實例方法中,直接訪問該屬性對應(yīng)的實例變量。下劃線前綴清晰地表明你正在訪問一個實例變量,而不是一個局部變量:
- (void)someMethod {NSString *myString = @"An interesting string";_someString = myString; }一般而言,你應(yīng)該使用存取方法或者點語法來訪問屬性,即使你是在它自己的類實現(xiàn)中訪問其屬性,在這種情況下,你需要使用self:
- (void)someMethod {NSString *myString = @"An interesting string";self.someString = myString;// or[self setSomeString:myString]; }self在object-c中代表當(dāng)前實例。這個規(guī)則的例外會出現(xiàn)在當(dāng)你寫初始化、釋放內(nèi)存或自定義存取方法的時候。
四、對象與方法
1、方法
在Object-C中,有兩種類型的方法,類方法和實例方法。
類方法以+開頭,其基本形式如下:
+ (id)someMethod;
類方法一般都是工廠方法,返回一個實例。
實例方法以-開頭,其基本形式如下:
- (void)someMethod;
方法可以不帶參數(shù),也可以帶一個或多個參數(shù),也可以有返回值:
- (int)someMethod; - (void)someMethodWithValue:(SomeType)value; - (void)someMethodWithFirstValue:(SomeType)value1 secondValue:(AnotherType)value2;2、對象的創(chuàng)建與初始化
Object-C的對象的內(nèi)存都是動態(tài)分配的,所以要使用指針來記錄一個對象。
NSObject根類提供了一個類方法,alloc,用來為對象動態(tài)分配內(nèi)存:
+ (id)alloc;
注意該方法的返回值是一個id類型,它表示指向一個對象的指針。alloc方法還有一個重要的任務(wù),就是清理分配給對象屬性的內(nèi)存,通過將其置為0。也就是說會它會幫你初始化對象的屬性。
與+ (id)alloc對應(yīng)的就是- (void) dealloc,它用來釋放對象的內(nèi)存,自動引用計數(shù)ARC會自動調(diào)用該函數(shù),而不用我們手動調(diào)用。
NSObject還提供了對象的初始化方法:
- (id)init;
這是一個實例方法。在init函數(shù)中你可以為對象的屬性賦予合適的初值。
與- (id)init對應(yīng)的是- (void) release,調(diào)用該函數(shù)會使得對象的引用計數(shù)-1,引用計數(shù)為0的話呢,ARC就會調(diào)用- (void) dealloc釋放掉對象的內(nèi)存。
3、消息
對象可以發(fā)送和接受消息,一個對象通過調(diào)用該對象的一個方法發(fā)送一個消息給另一個對象。這是object-C的說法,說白了就是函數(shù)調(diào)用。
對象發(fā)送消息的最常見形式如下:
[someObject doSomething]; [someObject doSomething: someValue];對象可以給自己發(fā)送消息:
[self saySomething:@"Hello, world!"];對象可以調(diào)用其父類實現(xiàn)的方法:
[super saySomething:@"Hello, world!"];五、類擴(kuò)展
類擴(kuò)展一般在實現(xiàn)文件的最上部實現(xiàn),用于擴(kuò)展類的內(nèi)部實現(xiàn)。
你可以在類擴(kuò)展中聲明一個屬性:
@interface yourClass () @property?someType someProperty; @end在類擴(kuò)展中聲明的屬性,編譯器同樣會為其生成相關(guān)的存取方法和實例變量。但是它只能在類的實現(xiàn)內(nèi)部進(jìn)行訪問。
你也可以聲明一個實例變量(不是屬性的實例變量):
@interface yourClass () {someType someValue; } @end這個實例變量也只能在類的實現(xiàn)內(nèi)部訪問。你還可以在類擴(kuò)展中聲明方法:
@interface yourClass () -(void)someMethod;@end這個方法需要在類實現(xiàn)中進(jìn)行實現(xiàn),并且只能在類實現(xiàn)中進(jìn)行調(diào)用。綜合起來,.m文件的基本格式如下: #import “yourClass.h“ @interface yourClass () {someType someValue; } @property someType someProperty; -(void)someMethod; @end
一些需要注意的問題,有一些上面提到過,再過一遍吧:
1、程序的頭文件和源文件的擴(kuò)展名分別為.h 和.m;
2、注釋:單行(//)和多行(/* … */);
3、Object_C 中的nil 相當(dāng)于NULL。
4、Object_C 中的YES 和NO 相當(dāng)于true 和false。
5、#import相當(dāng)于#include ,導(dǎo)入頭文件也有兩種查找方式< … > 和" … ",但是#import 可自動防止同一個文件被導(dǎo)入多次。6、Object_C中的所有類都必須繼承自NSObject。
7、Object_C僅支持單一父類繼承,不支持多重繼承。
8、Object_C中所有對象都是指針的形式。
9、Object_C用self代替this。
10、Object_C使用id代替void*。
11、Object_C中用消息表示類的方法,并采用[aInstance method:argv]調(diào)用形式。
12、Object_C支持反射機(jī)制。
13、Object_C支持Dynamic Typing,Dynamic Binding和Dynamic Loading。
本篇知識點回顧:
1、了解OC語言的基本特性;
2、掌握類的聲明、實現(xiàn);
3、掌握屬性的聲明和修飾;
4、掌握對象的創(chuàng)建和方法的聲明及實現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的第一篇 Object-C快速入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Render] Unity SRP 概
- 下一篇: Git与GitHub安装与配置