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