[英]isa pointer in objective-c
真正的好處是更好地理解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.