2012-06-12 24 views
13

Từ thông tin này:con trỏ isa trong Objective-C

Khi một đối tượng mới được tạo ra, bộ nhớ cho nó được phân bổ, và biến cá thể của nó được khởi tạo. Đầu tiên trong số các biến của đối tượng là một con trỏ trỏ đến cấu trúc lớp của nó. Con trỏ này, được gọi là isa, cho phép truy cập đối tượng vào lớp của nó và thông qua lớp học, cho tất cả các lớp học mà nó kế thừa từ đó.

Từ những gì tôi có thể hiểu được đọc thisthis, nó cho phép, cho một, sử dụng mẫn nhưng theo một cách thực dụng (phát triển iOS), những gì có thể là một lợi ích lập trình viên từ hiểu biết/hiểu con trỏ đặc biệt này?

+7

đọc nó là "là". "myObj là một ví dụ MyClass" – vikingosegundo

+0

bạn có ví dụ, đó là một con trỏ isa xin vui lòng? – user454083

Trả lời

16

Lợi ích thực sự là một sự hiểu biết tốt hơn về thời gian chạy Objective-C, mà thực sự khá phức tạp so với các ngôn ngữ tĩnh như C++. Con trỏ isa, về mặt thực tế, không thực sự được sử dụng nhiều đến mức trừ khi bạn đang hack thời gian chạy để làm một cái gì đó đặc biệt. This guide có thêm thông tin về cách nó được sử dụng bởi thời gian chạy.

Bạn không nên sử dụng trực tiếp mã số isa trong mã sản xuất. Nó giống như retainCount - điều quan trọng là bạn hiểu nó nhưng bạn không bao giờ nên gọi nó.

+2

+1 cho hướng dẫn. Giống như nhiều người dành một chút thời gian để stackoverflow, tôi muốn biết 'sâu lỗ thỏ đi'. – Peres

+0

Thời gian chạy Objective-C rất giống như vậy! Cho dù bạn học được bao nhiêu, có lẽ có điều gì đó khác, ngay cả khi đó là một hành vi hay thực hành sắc thái. –

0

điểm isa đến đối tượng lớp vì vậy đây sẽ làm việc

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

Hiểu cách sử dụng này, sẽ có một số lợi ích, chẳng hạn như mẫn và thử nghiệm trên các đối tượng lớp của đối tượng được tạo ra

+3

Tôi sẽ không khuyên bạn nên sử dụng điều này; 'if ([self isKindOfClass: [self class]])' là một cách tiếp cận tốt hơn nhiều, ngay cả khi kiểm tra sự bình đẳng của các đối tượng 'Class' là đúng về mặt kỹ thuật. –

+3

@AshFurrow bạn nghĩ gì 'isKindOfClass:' sử dụng để thực hiện hành vi của nó ...? ;) – Jasarien

+3

Tất nhiên! Nhưng đó là dưới mui xe. Cũng giống như bạn không nên gọi '.cxx_destruct' hoặc' objc_msgSend'. –

4

Trên môi trường 64 bit, không được truy cập vào trường ISA của đối tượng. Trường ISA không còn giữ con trỏ nữa. Nó bao gồm một số dữ liệu con trỏ và sử dụng các bit còn lại để giữ thông tin thời gian chạy khác. Thuộc tính CLASS hoặc hàm OBJECT_GETCLASS có thể được sử dụng để đọc một trường isa. OBJECT_SETCLASS có thể được sử dụng để viết một trường isa.

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

2

Khi chạy, khi một tin nhắn được gửi đến một đối tượng, đối tượng mà đi vào lớp mà tạo ra nó và nói:. "Tôi đã gửi thông điệp này Chạy mã của phương thức khớp . " Điều này khác với hầu hết các ngôn ngữ biên dịch, trong đó phương thức được thực hiện được xác định tại thời gian biên dịch.


LÀM THẾ NÀO ĐỂ BIỂU MỌI BIỂU TÀU KHÓA HỌC BẬC?

Nó sử dụng con trỏ isa. Mỗi đối tượng có một biến cá thể gọi là isa. Khi một đối tượng được tạo ra, lớp sẽ đặt biến cá thể isa của đối tượng trả về để trỏ trở lại lớp đó. Nó được gọi là con trỏ isa vì một đối tượng "là một" thể hiện của lớp đó. Mặc dù bạn có thể sẽ không bao giờ sử dụng con trỏ isa một cách rõ ràng, sự tồn tại của nó cho Objective-C nhận được nhiều quyền lực của nó.


Đối tượng chỉ trả lời thư nếu lớp của nó (được trỏ bởi con trỏ isa) thực hiện phương thức được liên kết. Bởi vì điều này xảy ra trong thời gian chạy, XCode không thể luôn luôn tìm ra tại thời gian biên dịch (khi ứng dụng được xây dựng) cho dù một đối tượng sẽ trả lời một tin nhắn.XCode sẽ cung cấp cho bạn một lỗi nếu nó cho rằng bạn đang gửi tin nhắn đến một đối tượng sẽ không trả lời, nhưng nếu nó không chắc chắn, nó sẽ cho phép ứng dụng xây dựng.


Nếu vì lý do nào đó (và có nhiều khả năng), bạn sẽ gửi thư đến một đối tượng không trả lời, ứng dụng của bạn sẽ ném một ngoại lệ. Vì vậy, isa con trỏ là lý do cho lỗi thời gian chạy . Hãy kiểm tra chi tiết và ví dụ tại đây: IOS - Objective-C - Exceptions And Unrecognized Selectors