2009-09-03 39 views
9

Hãy nói rằng tôi có một lớp khai báo là:Trong mục tiêu-C, làm thế nào để + phân bổ biết bao nhiêu bộ nhớ để phân bổ?

@class SomeClass 

@interface SomeClass: NSObject { 
    NSString *myString; 
    NSString *yourString; 
} 

@end 

Và sau đó, trong một số mã khác tôi nói:

SomeClass *myClass = [[SomeClass alloc] init]; 

như thế nào SomeClass biết bao nhiêu bộ nhớ để phân bổ cho rằng nó không ghi đè + phân bổ? Có lẽ nó cần lưu trữ cho các ivars myString và yourString, nhưng nó sử dụng + cấp phát kế thừa từ NSObject. Có tài liệu tham khảo bao gồm các chi tiết này không?

Trả lời

14

+alloc chỉ là phương pháp lớp học như bất kỳ phương pháp nào khác. Việc thực hiện mặc định trong NSObject, sử dụng class_getInstanceSize() để có được kích thước cá thể cần được cấp phát. Kích thước cá thể được xác định dựa trên sự kết hợp của mỗi lớp (không thừa kế) kích thước cấu trúc thời gian biên dịch và tính toán theo thời gian chạy của tổng kích thước của lớp và tất cả các lớp bậc trên. Đây là cách iVars không mong manh có thể trong 64 bit và thời gian chạy iPhone.

Một số lớp, nhóm lớp nói riêng, không thực sự phân bổ cá thể thực cho đến khi trình khởi tạo được gọi (đó là lý do tại sao điều quan trọng là làm self = [super init] trong phương thức khởi tạo của bạn).

+1

Cụm lớp là gì? Đây có phải là mục tiêu C-C tôi nên quen thuộc hơn không? –

+1

NSString là một nhóm lớp, ví dụ. Khi bạn tạo một NSString, bạn thực sự nhận được một cá thể của bất kỳ lớp con nào được tối ưu hóa để xử lý loại chuỗi cụ thể đó. – bbum

4

+[NSObject alloc] giải quyết cuộc gọi đến thời gian chạy Objective-C, biết được kích thước của mỗi lớp.

-2

Phương thức alloc tương đương với sizeof khi phương thức này tạo đối tượng mới. Ngoài ra, các biến đối tượng myStringyourString không thực sự có quá nhiều bộ nhớ: chúng chỉ là con trỏ, vì vậy, chỉ cần phân bổ đủ bộ nhớ để giữ địa chỉ.

+2

Nó không; sizeof là một thao tác chỉ thời gian biên dịch. Kích thước phân bổ được xác định trong thời gian chạy. – bbum

+0

Vâng, myString và yourString không có quá nhiều dung lượng lưu trữ, nhưng chúng có một số, và nó quan trọng, và nó phải được phân bổ ở đâu đó. –

+0

myString và yourString đều chính xác kích thước của một con trỏ trong SomeClass. – bbum

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