1. 程式人生 > >IOS基礎:深入理解Objective-c中@class的含義

IOS基礎:深入理解Objective-c中@class的含義

objective-c中,當一個類使用到另一個類時,並且在類的標頭檔案中需要建立被引用的指標時,

如下面程式碼:

 A.h檔案

  1. #import "B.h"  
  2. @interface A : NSObject {   
  3.     B *b;   
  4. }   
  5. @end  

為了簡單起見:A類是引用類,B類是被引用類,這裡先不考慮A類的實現檔案。

通常引用一個類有兩種辦法:

    一種是通過#import方式引入;另一種是通過@class引入;

這兩種的方式的區別在於:

 1、#import方式會包含被引用類的所有資訊,包括被引用類的變數和方法;@class方式只是告訴編譯器在A.h檔案中 B *b 只是類的宣告,具體這個類裡有什麼資訊,這裡不需要知道,等實現檔案中真正要用到時,才會真正去檢視B類中資訊;

2、使用@class方式由於只需要只要被引用類(B類)的名稱就可以了,而在實現類由於要用到被引用類中的實體變數和方法,所以需要使用#importl來包含被引用類的標頭檔案;

3、通過上面2點也很容易知道在編譯效率上,如果有上百個標頭檔案都#import了同一 個檔案,或者這些檔案依次被#improt(A->B, B->C,C->D…),一旦最開始的標頭檔案稍有改動,後面引用到這個檔案的所有類都需要重新編譯一遍,這樣的效率也是可想而知的,而相對來 講,使用@class方式就不會出現這種問題了;

4、對於迴圈依賴關係來說,比方A類引用B類,同時B類也引用A類,B類的程式碼:

  1. #import "A.h"  
  2. @interface B : NSObject {   
  3.     A *a;   
  4. }   
  5. @end  

當程式執行時,編譯會報錯, 

當使用@class在兩個類相互宣告,就不會出現編譯報錯。

 由上可知,@class是放在interface中的,只是在引用一個類,將這個被引用類作為一個型別,在實現檔案中,如果需要引用到被引用類的實體變數或者方法時,還需要使用#import方式引入被引用類。

如:

  1. #import "A.h" 
  2. #import "B.h" 
  3. @implementation A   
  4. ......  

舉個例子說明一下。

在ClassA.h中

#import ClassB.h 相當於#include整個.h標頭檔案。如果有很多.m檔案#import ClassA.h,那麼編譯的時候這些檔案也會#import ClassB.h增加了沒必要的#import,浪費編譯時間。在大型軟體中,減少.h檔案中的include是非常重要的。

如果只是 ClassB 那就沒有include ClassB.h。僅需要在需要用到ClassB的.m檔案中 #import ClassB.h

那麼什麼時候可以用呢?

如果ClassA.h中僅需要宣告一個ClassB的指標,那麼就可以在ClassA.h中宣告

@ClassB

...

ClassB *pointer;

所以,一般來說,@class是放在interface中的,只是為了在interface中引用這個類,把這個類作為一個型別來用的。 在實現這個介面的實現類中,如果需要引用這個類的實體變數或者方法之類的,還是需要import在@class中宣告的類進來. 

相關推薦

IOS基礎深入理解Objective-c@class含義

objective-c中,當一個類使用到另一個類時,並且在類的標頭檔案中需要建立被引用的指標時, 如下面程式碼:  A.h檔案 #import "B.h"   @interface A : NSObject {        B *b;    }    @end

深入理解Objective-CCategory

fix 忽略 DDU 相關 情況 內存布局 先生 們的 ntc https://tech.meituan.com/DiveIntoCategory.html 摘要 無論一個類設計的多麽完美,在未來的需求演進中,都有可能會碰到一些無法預測的情況。那怎麽擴展已有的類呢?一般而言

[美團技術團隊]&深入理解Objective-CCategory

屬性列表 prop chm hooks 一段 eth found 為我 更多 [轉載]深入理解Objective-C:Category 來自:美團技術團隊 無論一個類設計的多麽完美,在未來的需求演進中,都有可能會碰到一些無法預測的情況。那怎麽擴展已有的類呢?一般而言,繼

java基礎深入理解JDK動態代理

其他更多java基礎文章: java基礎學習(目錄) 經過上一節我們講了Class物件和反射機制,這節就來講一下反射機制在java中的主要應用——動態代理。在講動態代理之前,會先講一下代理模式和靜態代理。 一、代理模式 代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的介面,代理類主

Java基礎深入理解java異常處理機制的原理和開發應用【轉載】

Java異常處理機制在日常開發中應用頻繁,本篇文章主要在基礎的使用方法上,更進一步的,如何更加合理的使用異常機制,希望可以對各位朋友能有所幫助。   Java異常處理機制其最主要的幾個關鍵字:try、catch、finally、throw、throws,以及各種各樣

iOS---Objective-C@class與#import的區別

在Objective-C的專案中, @class通常放在.h檔案中, 主要作用在於提升編譯效能, 且能防止標頭檔案的遞迴import. 編譯效能的考慮 通常, 使用#import引入一個類的標頭檔案, 編譯時會將該類的標頭檔案中的所有資訊都引入, 包含屬

Java基礎深入理解Java的介面和抽象類

     對於面向物件程式設計來說,抽象是它的一大特徵之一。在Java中,可以通過兩種形式來體現OOP的抽象:介面和抽象類。這兩者有太多相似的地方,又有太多不同的地方。很多人在初學的時候會以為它們可以隨意互換使用,但是實際則不然。今天我們就一起來學習一下Java中的介面和

iOS開發深入理解UITableView的cell複用原理

簡介 在我們的日常開發中,絕大多數情況下只要詳細閱讀類標頭檔案裡的註釋,組合UIKit框架裡的大量控制元件就能很好的滿足工作的需求。但僅僅會使用UIKit裡的控制元件還遠遠不夠,假如現在產品需要一個類似 Excel 樣式的控制元件來呈現資料,需要這個控制元件能上下左右滑

Go語言基礎深入理解 struct 內嵌 inteface

1. 如何更好的理解匿名介面 // 匿名介面可以被用作變數或者結構屬性型別 type Man struct { gender interface { GetGender()

iOS沉思錄】深思Objective-C的property屬性

OC中的屬性 屬性(Property)是Objective-C語言的其中一個特性,它把類物件中的資料變數及其讀寫方法統一封裝起來,是對傳統C++中要重複為每個變數定義讀寫方法的一種封裝優化,OC將這些變數封裝為屬性變數,系統可自動生成getter和se

框架基礎深入理解Java註解型別(@Annotation)

註解的概念 註解的官方定義 首先看看官方對註解的描述: An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and pa

C異步IO淺析之三深入理解異步IO的基本數據結構

c 異步io libaio 一個函數庫或一段代碼的數據結構之間的關系,既展示了數據的行蹤,同時又隱含了函數的調用順序和使用方法。libaio內部的多個數據結構尤其如此,哪怕我們找不到文檔或者幫助手冊,只要深刻領悟頭文件中定義的數據結構及其內在聯系,再加一點代碼的驗證,就可以達到對libaio的A

Yii2基礎筆記(三)深入理解Yii2的view

首先,yii2 view在vendor/views中也是一個物件 一、render方法 任意一個controller都有5種render方法: 1.render(view檔名,待傳遞的引數陣列);如: `render('about',['num'=&

夯實Java基礎系列10深入理解Java的異常體系

目錄 為什麼要使用異常 異常基本定義 異常體系 初識異常 異常和錯誤 異常的處理方式 "不負責任"的throws 糾結的finally throw : JRE也使用的關鍵字 異常呼叫鏈 自定義異常 異常的注意事項 當finally遇上return JAVA異常常見面試題 參考文章 微信公眾號 Java技術

夯實Java基礎系列11深入理解Java的回撥機制

目錄 模組間的呼叫 多執行緒中的“回撥” Java回撥機制實戰 例項一 : 同步呼叫 例項二:由淺入深 例項三:Tom做題 參考文章

夯實Java基礎系列12深入理解Java的反射機制

本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫裡檢視 https://github.com/h2pl/Java-Tutorial 喜歡的話麻煩點下Star哈 文章首發於我的個人部落格: www.how2playlife.com 列舉(enum)型別是Java

java基礎學習總結(十二)深入理解java內部類

內部類 內部類也是語法糖,是因為它僅僅是一個編譯時的概念,outer.java裡面定義了一個內部類inner,一旦編譯成功,就會生成兩個完全不同的.class檔案了,分別是outer.class和outer$inner.class。所以內部類的名字完全可以和它的外部類名字相同。 內部類分為四

java基礎學習總結(九)深入理解Java泛型

一、什麼是泛型         “泛型” 意味著編寫的程式碼可以被不同型別的物件所重用。泛型的提出是為了編寫重用性更好的程式碼。泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。 比如常見的集合類 LinkedList: publi

Java基礎8深入理解內部類

這位大俠,這是我的公眾號:程式設計師江湖。 分享程式設計師面試與技術的那些事。 乾貨滿滿,關注就送。 本文主要介紹了Java內部類的基本原理,使用方法和各種細節。 有關內部類實現回撥,事件驅動和委託機制的文章將在後面釋出。 具體程式碼在我的GitHu

iOS --- Objective-C類的成員變數與屬性

在Objective-C的類與物件的概念中. 成員變數與屬性的區別與聯絡一直沒有搞清楚. 直到學習了慕課網上的這個課程Objective-C面向物件初體驗, 才算真正有了點感覺了. 最關鍵的結論就是: 類內使用成員變數{}, 類外使用屬性@property.