1.2.1 OC概述

来源:http://www.cnblogs.com/shorfng/archive/2016/11/23/6094899.html
-Advertisement-
Play Games

本文並非最終版本,如想關註更新或更正的內容,詳見文末的聯繫方式,如有疏忽和遺漏,歡迎指正。 本文相關目錄:(鏈接為簡書鏈接) ====================== 所屬文集: "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]


本文版權歸作者和本網站共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝合作。


如果覺得作者很用心,也可以請我喝杯咖啡
  • 支付寶掃一掃 向我付款

  • 你也可以微信 向我付款


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  •   現在直播越來越火,儼然已經成為了下一個紅海。作為一個資深碼農(我只喜歡這樣稱呼自己,不喜歡別人這樣稱呼我),我必須趕上時代的潮流,開始研究視頻直播。發現視屏直播類的文章上來就講拉流、推流、採集、美顏等第三方類的使用,我是小白很不懂啊。所以我決定開始系統分享從音頻、視頻類到視頻 ...
  • 不知不覺團隊已經有了4個iOS開發,大家的代碼風格完全不一樣,所以每次改起別人的代碼就頭疼,理解起來不是那麼順暢,如鯁在喉。所以,就開了場分享會,把一些基本調用方法和代碼風格統一了一下。 前言 主要參考了: "view層的組織和調用方案" "更輕量的View Controllers" "整潔的Tab ...
  • 思路: 實現: UILabel *label = [[UILabel alloc] init]; label.text = @"你好,這是UILabel的自動換行測試內容,主要實現多行數據的自動換行,自適應不同行數的數據"; NSDictionary *attribute = @{NSFontAtt ...
  • 一.Runtime是用C和彙編寫的 對於C語言,函數的調用在編譯的時候會決定調用哪個函數。對於OC的函數,屬於動態調用過程,在編譯的時候並不能決定真正調用哪個函數,只有在真正運行的時候才會根據函數的名稱找到對應的函數來調用。 二.Runtime常用頭文件 #import<objc/runtime.h ...
  • UITableView或UIScrollVIew上的UIButton的高亮效果 原文地址:http://www.jianshu.com/p/b4331f06bd34 最近做項目的時候發現,UIScrollView上的UIButton點擊的時候沒有高亮狀態,但是確實觸發了點擊事件,不過這樣會造成一個假 ...
  • 本文原文地址:http://www.cnblogs.com/qianLL/p/6095988.html 有時候 我們接收數據的時候 後臺給的數據室一串HTML 的字元串 但是 我們要顯示出來 這是 我們會發現文字可以自適應大小,但是有些圖片並不能自適應大小 這是 我們就需要去修改img的CSS樣式 ...
  • Android中GridView組件用來以網格方式排列視圖,與矩陣類似,當屏幕上有很多元素(文字、圖片或其他元素)需要顯示時,可以使用該組件。下麵我們通過代碼實現如下圖例(為了方便截圖,將事件處理(土司)設置到屏幕頂部) Layout下gridview.xml佈局文件: anroid:numColu ...
  • 30篇針對Android開發者的Kotlin語言的論文(KAD)的第一篇。在這系列論文中,作者將談及該語言的最要的部分和怎樣將它們應用到Android開發中。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...