Series này được chia thành nhiều phần.
- Phần 1: Khái niệm, ưu nhược điểm.
- Phẩn 2: Chúng ta có thể làm gì với objc runtime.
- Phần 3: Swift & Objc Runtime
- Phần 4: Inside Objc Class
- Phần 5: Message dispatch
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.