本文並非最終版本,如想關註更新或更正的內容,詳見文末的聯繫方式,如有疏忽和遺漏,歡迎指正。 本文相關目錄:(鏈接為簡書鏈接) ====================== 所屬文集: "1.2 Objective C" ====================== "1.2.0 開發須知" "1.2 ...
本文並非最終版本,如想關註更新或更正的內容,詳見文末的聯繫方式,如有疏忽和遺漏,歡迎指正。
本文相關目錄:(鏈接為簡書鏈接)
====================== 所屬文集:1.2 Objective-C ======================
1.2.0 開發須知
1.2.1 OC概述
1.2.2 類 未發佈
1.2.3 對象 未發佈
1.2.4 面向對象 未發佈
1.2.5 數據類型 未發佈
1.2.6 關鍵字 未發佈
1.2.7 記憶體管理->1.0 概述 未發佈
1.2.7 記憶體管理->2.1 MRC(手動引用計數) 未發佈
1.2.7 記憶體管理->2.2 ARC(自動引用計數) 未發佈
1.2.8 Category - 分類 未發佈
1.2.9 Protocol - 協議 未發佈
====================== 所屬文集:1.2 Objective-C ======================
本文目錄
1、OC簡介
OC 發展:
OC 特點:
C、OC、C++、C#之間的關聯
2、 新建 OC 項目步驟
步驟1:打開Xcode,創建一個新項目
步驟2、選擇項目模板(Xcode 8+)
步驟3、填選項目相關信息
步驟4、編寫代碼,選擇模擬器,運行(Command+R),並查看運行結果。
3、 第一個 OC 程式分析
總體分析
// #import 表示將該文件的信息導入到程式中
// 作用:告訴編譯器找到並處理名為Foundation.h文件,這是一個系統文件
// 把Foundation.h引入了,等於把OC的庫文件都引過來了
#import <Foundation/Foundation.h>
// 程式的入口 (argc表示參數數目 argv表示參數值)
int main(int argc, const char * argv[]) {
// 這是一個自動釋放池,用於回收對象的存儲空間
@autoreleasepool {
// NSLog是Foundation框架提供的Objective-C日誌輸出函數,與標準C中的printf函數類似,並可以格式化輸出。
// @“Hello, World!”,是代表NSString字元串對象,它是Objective-C常用的字元串類。
NSLog(@"Hello, World!");
}
// 表示要終止main的執行,一般情況下0代表正常結束,非0代表異常情況, 這是沿用了C語言的習慣
return 0;
}
具體分析:
// "xxx" 首先在當前文件找xxx文件,否則在開發工具裡面找,否則在系統中找
// <xxx> 首先在編譯器環境找xxx文件,否則在系統的環境里找
#include <stdio.h> // 可以使用C語言的 printf 輸出函數
// 預處理指令 import 的功能和 include一樣, 是將右邊的文件拷貝到當前import的位置
// import優點: 會自動防止重覆拷貝(意味著如果頭文件寫了N次,那麼import只會拷貝一次)
// Foundation.h我們稱之為主頭文件, 主頭文件中又拷貝了該工具箱中所有工具的頭文件, 我們只需要導入主頭文件就可以使用該工具箱中所有的工具, 避免了每次使用都要導入一個對應的頭文件
// 規律: ① 所有的主頭文件的名稱都和工具箱的名稱一致 ② 所有的主頭文件都導入了該工具箱中所有工具的頭文件
// 工具箱的地址: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks
#import <Foundation/Foundation.h> // 可以使用OC語言的 NSLog 輸出函數
int main(int argc, const char * argv[]) {
// printf - C中的日誌輸出函數
// printf不能自動換行
// printf不會輸出調試信息
// printf()輸出字元串的時候,用的是%s
// printf是一個字元串常量指針
// printf不能列印OC中的字元串
// printf不能列印OC中的對象 (%@占位符不能用),沒有結果
printf("c hello world\n");
printf("c hello world\n");
// NSLog - OC中的日誌輸出函數
// NSLog會自動換行
// NSLog在輸出內容時會附加一些系統信息(如時間等項目信息)
// NSLog()輸出字元串的時候,用的是%@
// NSLog輸出OC的特有的類型 %@(NSString), NSLog 函數的參數是一個NSString 對象
// NSLog在使用NSLog的時候,在格式控制字元串的末尾加上一個\n是不起作用
NSLog(@"OC hello World");
NSLog(@"OC hello World");
// 在oc程式中,使用oc的列印(NSLog),調用了c的函數(sum),輸出其結果
NSLog(@"sum = %i", sum(20, 10));
return 0;
}
官方類首碼:
第三方類首碼:
4、OC和C的差異
源文件對比:
基本語法對比:
關鍵字對比:
數據類型對比:
流程式控制制語句對比:
函數與方法的定義和聲明對比:
面向對象新增特性:
面向對象新增語法:
新增異常捕捉方法:
格式:
@try {
< #statements#>
}
@catch (NSException *exception) {
//捕捉最具體的異常類型
< #handler#>
}
@catch (NSException *ne) {
//捕獲一個比較重要的異常類型。
}
@catch (id ue) {
//再次擲出捕獲的異常。
}
@finally{
//不管有沒有異常finally內的代碼都會執行。
< #statements#>
}
舉例:
#import "ViewController.h"
@interfaceViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
//註意:try catch 並不能檢測所有的錯誤
@try { //此處放的是有可能出錯的代碼
NSString *str = @"abc";
NSLog(@"要出異常了");
[str substringFromIndex:111];
} @catch (NSException *exception) { //此處放出錯以後,我們處理的代碼
NSLog(@"捕捉到的異常");
NSLog(@"exception = %s%@",__FUNCTION__, exception);
} @finally { //不管出沒出錯,這裡的代碼一定會執行
printf("一定會執行的代碼!\n");
}
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.}
@end
列印結果:
Test[14869:2214622]要出異常了
Test[14869:2214622]捕捉到的異常
Test[14869:2214622] exception = -[ViewController viewDidLoad]***-[__NSCFConstantString substringFromIndex:]: Index 111 out of bounds; string length 3
一定會執行的代碼!
說明:
objc 異常捕捉方法是檢測oc 中方法是否正確使用,不能用來檢測語法錯誤。只能用來檢測方法使用的正確與否。
作者:藍田(Loto)
【作品發佈平臺】
① 簡書
② 博客園
③ Gitbook(如果覺得文章太長,請閱讀此平臺發佈的文章,記得給個Star喲~)
【代碼托管平臺】
Github(幫忙點點Star啦~)
【如有疑問,請通過以下方式交流】
① 評論區回覆
② 發送郵件
至 [email protected]
本文版權歸作者和本網站共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝合作。
如果覺得作者很用心,也可以請我喝杯咖啡
支付寶掃一掃 向我付款
你也可以微信 向我付款