Cờ liên kết -all_load làm gì?


123

Tôi không thể tìm thấy bất cứ nơi nào cờ -all_load làm khi biên dịch mã Objective-C.

Tôi có một số vấn đề khi tải tệp nhị phân lên Apple, họ nói rằng đó là vì tôi đã không sử dụng cờ này, nhưng mã của tôi biên dịch ngay cả khi không có nó.

Ai đó có thể giúp tôi với?

Cảm ơn


2
Thông thường, bất kỳ lỗi nào bạn thấy với điều này xảy ra trên thiết bị khi chạy ứng dụng. Bạn có nói rằng bạn đã không kiểm tra ứng dụng của mình trên phần cứng thực tế trước khi đệ trình để Apple xem xét? Nếu vậy, đó là một ý tưởng rất, rất xấu.
Brad Larson

Tôi đã kiểm tra nó, tuy nhiên cấu hình "phân phối" của tôi - cấu hình có hồ sơ cung cấp cửa hàng ứng dụng - không có cờ và tất cả các thử nghiệm đã được thực hiện bằng cách sử dụng hồ sơ phát triển có cờ nên mọi thứ đều ổn và khi nào Tôi đã biên dịch nó cho cửa hàng ứng dụng với hồ sơ phân phối, cờ bị tắt và vì hồ sơ phân phối không thể được cài đặt cục bộ nên tôi không thể kiểm tra nó.
Guy Ephraim

Câu trả lời:


144

Nó có thể liên quan đến ghi chú kỹ thuật này https://developer.apple.com/l Library / content / qa / qa1490 / _index.html

QUAN TRỌNG: Đối với các ứng dụng HĐH iPhone 64 bit, có một lỗi liên kết ngăn -ObjC tải các tệp đối tượng từ các thư viện tĩnh chỉ chứa các danh mục và không có lớp. Cách giải quyết là sử dụng cờ -all_load hoặc -force_load. -all_load buộc trình liên kết tải tất cả các tệp đối tượng từ mọi tệp lưu trữ mà nó nhìn thấy, ngay cả những tệp không có mã Objective-C. -force_load có sẵn trong Xcode 3.2 trở lên. Nó cho phép kiểm soát hạt tốt hơn của tải lưu trữ. Mỗi tùy chọn -force_load phải được theo sau bởi một đường dẫn đến kho lưu trữ và mọi tệp đối tượng trong kho lưu trữ đó sẽ được tải.


3
Vâng, điều này chủ yếu đi kèm với các thư viện tĩnh cho iPhone. Nếu chúng được biên dịch mà không có cờ liên kết này, các danh mục không được bao gồm trong tệp nhị phân được xây dựng và bất kỳ ứng dụng nào sử dụng các thư viện tĩnh này sẽ có lỗi thời gian chạy khi được thực thi trên phần cứng HĐH iPhone.
Brad Larson

1
không nên có một số cảnh báo hoặc lỗi của phương thức bị thiếu trong thời gian biên dịch?
Guy Ephraim

18
Không, bởi vì các danh mục tồn tại vào thời gian biên dịch, chúng chỉ không được liên kết thành nhị phân cuối cùng. Nhưng do tính chất động của các công văn Obj-C, trình liên kết không trỏ mã gọi trực tiếp đến phương thức triển khai, vì vậy nó không bao giờ nhận thấy rằng nó bị thiếu. Sau đó, trong thời gian chạy, bạn nhận được kaboom, giống như khi bạn gọi nó bằng cách sử dụng "-performSelector:"
Sophistifunk

14
Chỉ muốn làm rõ các lưu ý kỹ thuật: Hầu hết thời gian bạn sẽ muốn cờ liên kết -ObjC, không phải -all_load. -all_load được khuyến nghị trong trường hợp (tôi giả sử là hiếm) nơi bạn có một thư viện không có lớp, chỉ có các danh mục.
Đồi Chris

3
Theo stackoverflow.com/a/2615407/62, điều này đã được sửa từ XCode 4.2, vì vậy bạn không cần các cờ -all_load hoặc -force_load nữa. Bạn vẫn cần -ObjC.
Liron Yahdav
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.