2012-01-23 26 views
5

Có an toàn khi sử dụng các lớp được định nghĩa trong dự án của bạn trong phạm vi __attribute __ ((constructor))? Thời gian chạy C mục tiêu có một cơ hội để làm những gì nó cần phải làm gì với các lớp học của bạn khi các hàm __attribute __ ((constructor)) được gọi là? Hoặc tôi hiểu lầm cách thời gian chạy tải các lớp học và không có sự khác biệt giữa các lớp thư viện và của riêng bạn trong bối cảnh này?các lớp chức năng __attribute __ ((constructor) an toàn

+0

Bạn đã thử những gì? Tài liệu GCC cho biết thuộc tính này hiện không được hỗ trợ cho Objective-C (http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html), và tài liệu Clang dường như im lặng về vấn đề này. – CRD

+1

@CRD Trình xây dựng hình ảnh hoạt động như mong đợi bằng cả hai trình biên dịch được phân phối bằng Xcode. – justin

+0

@Justin - rất nhiều tài liệu ;-) Âm thanh như bạn nên đăng bình luận của bạn như là câu trả lời. Nathan, tại sao bạn muốn sử dụng thuộc tính này chứ không phải là '+ initialize', được chạy trước khi sử dụng bất kỳ lớp nào? – CRD

Trả lời

7

Tôi sẽ đề nghị bạn sử dụng + initialize hoặc + load thay vì thuộc tính, nhưng đó là sở thích của tôi.

Phương thức + load của lớp được gọi khi lớp được tải bởi thời gian chạy.

Phương thức + initialize của một lớp được gọi trước bất kỳ phương thức nào khác trong lớp.

Từ các tài liệu cho load:

Trên Mac OS X v10.5, thứ tự khởi tạo như sau:

  1. Tất cả initializers trong bất kỳ khuôn khổ bạn liên kết đến.
  2. Tất cả các phương pháp tải trong hình ảnh của bạn.
  3. Tất cả bộ khởi tạo tĩnh C++ và C/C++ thuộc tính (hàm tạo) hoạt động trong hình ảnh của bạn.
  4. Tất cả trình khởi tạo trong các khung liên kết đến bạn.

Ngoài ra:

  • phương pháp + tải của một lớp được gọi sau khi tất cả các phương pháp + tải superclasses của nó.
  • Phương thức tải + danh mục được gọi sau phương thức tải + riêng của lớp học.

Trong phương thức + tải, bạn có thể an toàn gửi các lớp không có liên quan khác từ cùng một hình ảnh, nhưng bất kỳ phương thức + tải nào trên các lớp đó có thể chưa chạy.

Điều này làm cho rõ ràng mọi phương thức được phân bổ hoặc + load sẽ chạy sau khi thời gian chạy được khởi tạo. Và như + load là một phương thức trên lớp của bạn và được chạy trước bất kỳ phương thức được phân bổ nào sau đó trước khi thời gian chạy phải thiết lập lớp của bạn.

+0

+1 tìm kiếm tốt, CRD! – justin

0

Đó không phải là chức năng, chúng chỉ là ký hiệu thuộc tính trình biên dịch. Họ sẽ không thay đổi mã được tạo ra.

+0

nó được sử dụng để nói "gọi chức năng này khi hình ảnh được tải", và nó được hỗ trợ. câu hỏi liên quan đến thứ tự khởi tạo. nghĩ về nó theo cách này: * Tôi có một khuôn khổ trong đó có một chức năng init và một số lớp học objc. tôi có thể sử dụng một cách an toàn các loại objc được xuất bởi khung công tác trong hàm xây dựng của khung công tác không? chúng sẽ được tải vào thời gian chạy theo điểm đó không? * – justin

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