2012-01-06 17 views
9

Tôi biết rằng phân bổ là một phương thức lớp tạo đối tượng của lớp và trỏ con trỏ "isa" của nó vào lớp và đó là cách các thư được ánh xạ khi chạy.Phân bổ công việc như thế nào trong Mục tiêu C?

và tôi có một số ý tưởng về allocWithZone và vùng.

Bất cứ ai có thể cho tôi biết hoặc chỉ cho tôi liên kết tốt đẹp giải thích: -

Cách trỏ con trỏ đến đúng lớp?

Dung lượng bộ nhớ được phân bổ là bao nhiêu?

Bộ nhớ cho các thành viên được kế thừa từ lớp cha được tạo như thế nào?

Nếu id là typedef cho objc_object *, con trỏ isa của nó trỏ đến, thì nó giữ anyobject vì con trỏ isa sẽ đưa chúng ta đến bảng công cụ có bộ chọn cho phương thức nhưng chúng có bất cứ thứ gì cho chúng ta biết những thành viên dữ liệu nào được cho là ở đó?

Trả lời

8

Trình biên dịch chèn cuộc gọi qua thời gian chạy objc cho bạn, đằng sau hậu trường. Bạn có thể tìm thấy thư viện trong đường dẫn bao gồm objc/. objc/runtime.h có lẽ sẽ được quan tâm nhiều nhất. Là một phần thưởng, một vài thông báo chọn thông thường sẽ bỏ qua objc_msgSend với các chèn này.

Cách con trỏ isa được trỏ đến đúng lớp?

objc_constructInstance

được phân bổ bao nhiêu bộ nhớ?

class_createInstance 
class_getInstanceSize 

Bộ nhớ cho các thành viên được thừa kế từ lớp gốc được tạo ra như thế nào?

Bộ nhớ bằng 0 và isa được đặt.

Nếu id là typedef cho objc_object *, con trỏ isa trỏ đến, thì nó giữ anyobject vì con trỏ isa sẽ đưa chúng ta đến bảng công cụ có bộ chọn cho phương thức nhưng chúng có bất cứ điều gì cho chúng tôi những gì các thành viên dữ liệu được cho là ở đó?

Bất cứ điều gì được đặt lúc khởi tạo. ObjC đối tượng con trỏ chỉ là bộ nhớ nguyên. Không giống như các ngôn ngữ khác, đúc và chuyển đổi các loại văn bản là một tập hợp trực tiếp địa chỉ của biến - không có quảng cáo rõ ràng loại hoặc chuyển đổi trong bộ nhớ trong cấu trúc sau:

MONDisplay * display = [NSString string]; 
NSLog(@"%@", display); 

con trỏ chỉ là cùng một giá trị được trả về bởi [NSString string].

+1

'id' là một loại đại diện cho một con trỏ, không phải là một đối tượng, vì vậy nó không có một' isa 'của riêng nó. Khi bạn khai báo một biến kiểu 'id', nó chỉ có nghĩa là bạn có thể gán một con trỏ cho bất kỳ kiểu đối tượng nào và trình biên dịch sẽ không phàn nàn về nó. Bản thân đối tượng có một thành viên 'isa', và theo định nghĩa, nó trỏ tới lớp mà đối tượng được đề cập là một cá thể. – Caleb

Các vấn đề liên quan