當我開始為iOS寫代碼的時候,我意識到,作為一個C++開發者,我必須花費更多的時間來弄清楚Objective-C中怪異的東西。這就是一個幫助C++專家的快速指南,能夠使他們快速的掌握Apple的iOS語言。
請注意這絕不是一個完整的指南,但是它讓你避免了閱讀100頁的手冊。除此之外,我知道你喜歡我的寫作風格。
Objective-C中@property的所有屬性詳解 http://www.linuxidc.com/Linux/2014-03/97744.htm
Objective-C 和 Core Foundation 對象相互轉換的內存管理總結 http://www.linuxidc.com/Linux/2014-03/97626.htm
使用 Objective-C 一年後我對它的看法 http://www.linuxidc.com/Linux/2013-12/94309.htm
10個Objective-C基礎面試題,iOS面試必備 http://www.linuxidc.com/Linux/2013-07/87393.htm
Objective-C適用C數學函數 <math.h> http://www.linuxidc.com/Linux/2013-06/86215.htm
需要C++的技能,我會比較C++和Objective-C的東西。此外,COM編程也是有用的,因為Objective-C有類似於IUnkown的東西,因此基礎的COM編程是有幫助的(但不是必須的)
Objective C++是C++和Objective C的組合。你也能使用任何C++的東西混合到Objective C中,但是記住重新命名你的文件從.m到.mm
我們馬上就開始我們的教程. 首先我會介紹 Objective-C 的東西,然後是C++中與它對等的東西.
成員函數
// Objective-C
- (int) foo : (int) a : (char) b {}
+ (int) foo : (int) a : (char) b {}
// C++
int foo(int a,char b) {}
static int foo(int a,char b) {}
// Objective-C
- (void) foo2 val1:(int) a; // named argument
// call
[obj foo2 val1:5]; // merely helper: You remember that 5 is assigned to param name val1.
- 表示的是一個一般的成員函數(通過一個對象實體訪問), 而 + 則表示一個靜態成員函數, 不需要使用實體就能訪問. 當然,像C++, 靜態成員不能訪問實體變量.
此外,Objective-C函數函數可以有賦予了名稱的參數,這樣讓什麼參數獲得什麼值會更一目了然. 理論上,被賦予了名稱的參數允許程序員按任何順序傳入參數,但是Objective-C卻規定要按聲明的順序傳參.
通過一個指針或者一個靜態成員調用一個成員
// Objective-C
NSObject* ptr = ...; // some pointer
[ptr foo:5:3]; // call foo member with arguments 5 and 3
[NSObject staticfoo:5:3]; // call static function of NSOBject with arguments 4 and 3
// C++
CPPObject* ptr = ...; // some pointer
ptr->foo(5,3);
CPPObject::staticfoo(5,3);
Objective-C 使用 [ ] 來調用成員函數並傳入用:分割開的參數, 其對於ObjectiveC中ptr為nil的情況非常友好,在這種情況下“調用”將會被忽略掉(而在C++中,這種情況會拋出一個指針沖突異常 ). 這使得消除對nil對象的檢查成為可能.
協議VS接口
// Objective-C
@protocol foo
- (void) somefunction;
@end
@interface c1 : NSObject<foo>
@end
@implementation c1
- (void) somefunction { ... }
@end
// C++
class foo
{
virtual void somefunction() = 0;
};
class c1 : public NSObject, public foo
{
void somefunction() { ... }
}
協議= 抽象類. Objective-C 和 C++ 之間的區別在於,在 Objective-C 中, 函數並不是必須要被實現的. 你可以讓一個可選的方法被動的被聲明,而這僅僅只是向編譯器發出暗示而已,並不是編譯必須的.
檢查一個方法是否被實現了
// Objective-C
NSObject* ptr = ...; // some pointer
[ptr somefunction:5:3]; // NSObject 不必一定為其編譯而實現somefunction. 如果沒有被實現的話,會引發異常.
// C++
CPPObject* ptr = ...; // some pointer
ptr->somefunction(5,3); // CPPObject 必須實現 somefunction() 否則程序根本就不會被編譯.
Objective-C 成員函數就是(Smalltalk中的) "消息" 而在Objective-C中時,我們則說接收者 (即指針) 會向一個選擇器做出回應, 這意味著其實現了我們嘗試去調用的虛函數. 當有一個接口是, C++ 對象必須實現其所有的成員函數. 而在 Objective-C 中這並不是必須的,因此我們可以向並不必須要實現它的某個地方發送一個”消息“ (如此就會引發一個異常).
// Objective-C
NSObject* ptr = ...; // some pointer
if ([ptr respondsToSelector:@selector(somefunction::)]
[ptr somefunction:5:3];
現在我們就可以確定接收者向選擇器做出回應, 我們因此就可以調用它了. 在 C++ 中不需要這樣的檢查, 因為實現必須常常”向選擇器做出回應“, 否則源代碼根本就不會被編譯. 請注意我們必須知道選擇器獲取了多少個參數(因此在該@selector中是2個 ::s
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-05/101768p2.htm