簡體   English   中英

isa指針在objective-c中

[英]isa pointer in objective-c

從這個參考:

創建新對象時,將分配其內存,並初始化其實例變量。 對象變量中的第一個是指向其類結構的指針。 這個名為isa的指針使對象可以訪問它的類,並通過該類訪問它繼承的所有類。

從我能理解的內容中讀到這個 ,它允許一個人使用內省但是以實用的方式(iOS開發), 程序員可以從知道/理解這個特殊指針中獲益嗎?

真正的好處是更好地理解Objective-C運行時,與C ++等靜態語言相比,它實際上相當復雜。 實際上, isa指針實際上並沒有真正使用,除非你正在攻擊運行時做一些特別的事情。 本指南提供了有關運行時如何使用它的更多信息。

您不應該直接在生產代碼中使用isa 這就像retainCount - 重要的是你了解它,但你不應該稱之為。

在64位環境中,不應訪問對象的ISA字段。 ISA字段不再包含指針。 它包括一些指針數據,並使用其余位來保存其他運行時信息。 CLASS屬性或OBJECT_GETCLASS函數可用於讀取isa字段。 OBJECT_SETCLASS可用於編寫isa字段。

參考: https//developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html#//apple_ref/doc/uid/TP40013501-CH3-SW1

在運行時,當一個消息發送到一個對象時,該對象轉到創建它的類,並說:“我收到了這條消息。運行匹配方法的代碼。” 這與大多數編譯語言不同,后者在編譯時確定要執行的方法。


一個對象如何知道哪個類創建它?

它使用isa指針。 每個對象都有一個名為isa的實例變量。 創建對象時,該類將返回對象的isa實例變量設置為指向該類。 它被稱為isa指針,因為對象“是該類的實例”。 雖然你可能永遠不會明確地使用isa指針,但它的存在使Objective-C獲得了很大的功能。


如果對象的類(由其isa指針指向)實現關聯的方法,則該對象僅響應消息。 因為這在運行時發生,所以XCode不能總是在編譯時(構建應用程序時)弄清楚對象是否會響應消息。 如果XCode認為您正在向不響應的對象發送消息,則會給您一個錯誤,但如果它不確定,它將讓應用程序構建。


如果由於某種原因(並且有很多可能性),您最終會向沒有響應的對象發送消息,您的應用程序將拋出異​​常。 所以isa指針是運行時錯誤的原因。 讓我們在這里查看詳細信息和示例: IOS - Objective-C - 異常和無法識別的選擇器

isa指向類對象,因此這將起作用

if(self->isa == [self class])
    NSLog(@"True");

了解如何使用它會有一些好處,例如對所創建對象的類對象進行內省和測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM