Objective-C Runtime Part 1

Objective-C Runtime Part 1

Series này được chia thành nhiều phần.

1. Khái niệm

Objective-C runtime là một thư viện runtime, được viết chủ yếu bằng C và assembly, là trái tim của ngôn ngữ Objective-C. Nó thêm tính năng hướng đối tượng cho ngôn ngữ C để tạo ra ngôn ngữ Objective C. Thiếu nó ngôn ngữ objective-c không thể chạy được, .

Objc runtime xử lý message dispatch, xử lý retain/release/autorelease,… Các cơ chế này mình sẽ bổ sung thêm vào các phần sau của bài viết, các bạn chờ đón đọc nhé. Ahihi 😜

Binary của objc runtime được đặt tại path /usr/lib/libobjc.A.dylib. App sẽ tự động được liên kết với objc runtime sau khi compile.

Trong bài mình sẽ gọi tắt là objc runtime cho ngắn gọn.

2. Objc Runtime hoạt động như nào

Message Dispatch

Trong objc, hàm không được gọi trực tiếp mà được gọi theo cơ chế truyền thông điệp. Vì xử lý như vậy nên trường hợp biến obj ở dưới bị nil thì chương trình cũng không bị crash hay exception gì cả. 🥳🥳🥳

[obj hello];

Khi biên dịch đoạn code gọi hàm sẽ trở thành

objc_msgSend(obj, @selector(hello));

Sau khi gọi hàm trên, objc runtime sẽ tiến hành tìm IMP( Implement) của function đó và tiến hành gọi hàm.

Đây là cơ chế Message Dispatch của objc runtime. Chúng ta hoàn toàn của thể thay đổi hành vi của các class bằng các phương thức như method swizzling, hay forward target

Xử lý retain/release/autorelease

Khi gọi retain/release objc runtime sẽ tự động cập nhật retain count ở trong mảng băm SideTable. Khi object không còn được sử dụng nữa thì nó sẽ chịu trách nhiệm giải phóng bộ nhớ của object.

Ngoài ra khi sử dụng Autorelease pool, objc runtime cũng lưu trữ pool và thực hiện release bộ nhớ khi pool bị drain.

3. Ưu điểm của objc runtime

Góp phần quan trọng tạo nên ngôn ngữ Objc và khiến nó thành ngôn ngữ dynamic

Như ở trên mình có nói, objc runtime cung cấp khả năng hướng đối tượng cho ngôn ngữ C để tạo ra ngôn ngữ Objc. Nó giúp cho objc có thể thêm class, property trong lúc runtime.

Hỗ trợ reference counting

Reference counting là tính năng dùng để quản lý bộ nhớ, khi obj không còn sử dụng nữa(không còn được tham chiếu nữa) thì vùng nhớ obj sẽ bị huỷ.

4. Nhược điểm của objc runtime

Performance không được tốt như C

Tất nhiên rồi, vì nó là ngôn ngữ dynamic. Nên khi gọi hàm thì sẽ không gọi trực tiếp mà nó sẽ phải tìm implement của method đó sau đó mới gọi.

Dễ bị hack

Hacker có thể dễ dàng hook vào đầu hoặc cuối của hàm objc để thay đổi cũng như đánh cắp thông tin trong app. Ngoài ra họ có thể thay đổi hành vi của app, ví dụ như hàm A gọi hàm C thay vì hàm A gọi hàm B.

Phần này nội dung chỉ ngắn gọn như vậy thôi, mình sẽ đi sâu dần vào những phần sau.

Leave a Reply

%d bloggers like this: