Cách tốt nhất để giải quyết xung đột không gian tên Objective-C là gì?


174

Objective-C không có không gian tên; nó giống như C, mọi thứ đều nằm trong một không gian tên toàn cầu. Thực tiễn phổ biến là các lớp tiền tố có chữ cái đầu, ví dụ nếu bạn đang làm việc tại IBM, bạn có thể đặt tiền tố cho chúng bằng "IBM"; nếu bạn làm việc cho Microsoft, bạn có thể sử dụng "MS"; và như thế. Đôi khi tên viết tắt đề cập đến dự án, ví dụ: các lớp tiền tố Adium với "AI" (vì không có công ty nào đứng sau dự án mà bạn có thể lấy tên viết tắt). Tiền tố của Apple có các lớp với NS và cho biết tiền tố này chỉ dành riêng cho Apple.

Cho đến nay rất tốt. Nhưng việc thêm 2 đến 4 chữ cái vào một tên lớp ở phía trước là một không gian tên rất, rất hạn chế. Ví dụ: MS hoặc AI có thể có một ý nghĩa hoàn toàn khác (ví dụ AI có thể là Trí tuệ nhân tạo) và một số nhà phát triển khác có thể quyết định sử dụng chúng và tạo ra một lớp có tên giống nhau. Bang , va chạm không gian tên.

Được rồi, nếu đây là sự va chạm giữa một trong các lớp của riêng bạn và một trong các khung bên ngoài bạn đang sử dụng, bạn có thể dễ dàng thay đổi cách đặt tên của lớp, không có vấn đề gì lớn. Nhưng nếu bạn sử dụng hai khung bên ngoài, cả hai khung mà bạn không có nguồn và bạn không thể thay đổi thì sao? Ứng dụng của bạn liên kết với cả hai và bạn nhận được xung đột tên. Làm thế nào bạn sẽ đi về giải quyết những điều này? Cách tốt nhất để làm việc xung quanh chúng theo cách mà bạn vẫn có thể sử dụng cả hai lớp là gì?

Trong C, bạn có thể giải quyết những vấn đề này bằng cách không liên kết trực tiếp đến thư viện, thay vào đó bạn tải thư viện khi chạy, sử dụng dlopen (), sau đó tìm biểu tượng bạn đang tìm kiếm bằng cách sử dụng dlsym () và gán nó cho biểu tượng toàn cầu (mà bạn có thể đặt tên theo bất kỳ cách nào bạn thích) và sau đó truy cập nó thông qua biểu tượng toàn cầu này. Ví dụ: nếu bạn có xung đột vì một số thư viện C có hàm tên là open (), bạn có thể xác định một biến có tên myOpen và để nó trỏ đến hàm open () của thư viện, do đó khi bạn muốn sử dụng hệ thống open () , bạn chỉ cần sử dụng open () và khi bạn muốn sử dụng cái khác, bạn truy cập nó thông qua định danh myOpen.

Có một cái gì đó tương tự có thể có trong Objective-C và nếu không, có giải pháp khéo léo, khéo léo nào khác mà bạn có thể sử dụng để giải quyết xung đột không gian tên không? Có ý kiến ​​gì không?


Cập nhật:

Chỉ cần làm rõ điều này: các câu trả lời gợi ý cách tránh va chạm không gian tên trước hoặc cách tạo không gian tên tốt hơn chắc chắn được hoan nghênh; tuy nhiên, tôi sẽ không chấp nhận chúng là câu trả lời vì chúng không giải quyết được vấn đề của tôi. Tôi có hai thư viện và tên lớp của họ va chạm. Tôi không thể thay đổi chúng; Tôi không có nguồn của một trong hai. Vụ va chạm đã có và những lời khuyên về cách có thể tránh được trước sẽ không giúp được nữa. Tôi có thể chuyển tiếp chúng cho các nhà phát triển của các khung này và hy vọng họ chọn một không gian tên tốt hơn trong tương lai, nhưng hiện tại tôi đang tìm kiếm một giải pháp để làm việc với các khung ngay bây giờ trong một ứng dụng. Bất kỳ giải pháp để thực hiện điều này có thể?


7
Bạn có một câu hỏi hay (phải làm gì nếu bạn cần hai khung có xung đột tên) nhưng nó bị chôn vùi trong văn bản. Sửa lại để làm cho nó rõ ràng hơn và bạn sẽ tránh được những câu trả lời đơn giản như câu trả lời bạn có bây giờ.
benzado

4
Đây là điểm hấp dẫn nhất của tôi với thiết kế hiện tại của ngôn ngữ Objective-C. Nhìn vào các câu trả lời dưới đây; những vấn đề thực sự giải quyết câu hỏi (NSBundle dỡ tải, sử dụng DO, v.v.) là những bản hack ghê tởm không cần thiết cho một thứ tầm thường như tránh xung đột không gian tên.
erikprice

@erikprice: Amen. Tôi đang học obj-c, và đánh vào vấn đề này. Đến đây tìm kiếm một giải pháp đơn giản .... khập khiễng.
Dave Mateer

1
Đối với bản ghi, về mặt kỹ thuật, cả C và Objective-C đều cung cấp hỗ trợ cho nhiều không gian tên - mặc dù không chính xác những gì OP đang tìm kiếm. Xem objectivistc.tumblr.com/post/3340816080/

Hmm, tôi không biết điều đó. Loại quyết định thiết kế khủng khiếp không?
Nico

Câu trả lời:


47

Nếu bạn không cần sử dụng các lớp từ cả hai khung hình cùng một lúc và bạn đang nhắm mục tiêu các nền tảng hỗ trợ dỡ tải NSBundle (OS X 10.4 trở lên, không hỗ trợ GNUStep) và hiệu suất thực sự không phải là vấn đề đối với bạn, tôi tin rằng rằng bạn có thể tải một khung công tác mỗi khi bạn cần sử dụng một lớp từ nó, sau đó dỡ bỏ khung đó và tải khung kia khi bạn cần sử dụng khung khác.

Ý tưởng ban đầu của tôi là sử dụng NSBundle để tải một trong các khung, sau đó sao chép hoặc đổi tên các lớp bên trong khung đó và sau đó tải khung khác. Có hai vấn đề này. Đầu tiên, tôi không thể tìm thấy một hàm để sao chép dữ liệu được chỉ định để đổi tên hoặc sao chép một lớp và bất kỳ lớp nào khác trong khung đầu tiên tham chiếu lớp được đổi tên bây giờ sẽ tham chiếu lớp từ khung khác.

Bạn sẽ không cần phải sao chép hoặc đổi tên một lớp nếu có cách sao chép dữ liệu được chỉ ra bởi một IMP. Bạn có thể tạo một lớp mới và sau đó sao chép qua ivars, phương thức, thuộc tính và danh mục. Nhiều công việc hơn, nhưng nó có thể. Tuy nhiên, bạn vẫn sẽ gặp vấn đề với các lớp khác trong khung tham chiếu lớp sai.

EDIT: Sự khác biệt cơ bản giữa thời gian chạy của C và Objective-C là, theo tôi hiểu, khi các thư viện được tải, các hàm trong các thư viện đó chứa các con trỏ tới bất kỳ ký hiệu nào mà chúng tham chiếu, trong khi ở Objective-C, chúng chứa các biểu diễn chuỗi của tên của các biểu tượng thsoe. Do đó, trong ví dụ của bạn, bạn có thể sử dụng dlsym để lấy địa chỉ của biểu tượng trong bộ nhớ và gắn nó vào biểu tượng khác. Mã khác trong thư viện vẫn hoạt động vì bạn không thay đổi địa chỉ của biểu tượng gốc. Objective-C sử dụng bảng tra cứu để ánh xạ tên lớp thành địa chỉ và đó là ánh xạ 1-1, vì vậy bạn không thể có hai lớp có cùng tên. Vì vậy, để tải cả hai lớp, một trong số chúng phải thay đổi tên của chúng. Tuy nhiên, khi các lớp khác cần truy cập vào một trong các lớp có tên đó,


5
Tôi tin rằng việc dỡ gói không được hỗ trợ cho đến ngày 10.5 trở đi.
Quinn Taylor

93

Tiền tố các lớp học của bạn với một tiền tố duy nhất về cơ bản là lựa chọn duy nhất nhưng có một số cách để làm cho điều này bớt khó chịu và xấu xí. Có một cuộc thảo luận dài về các lựa chọn ở đây . Yêu thích của tôi là @compatibility_aliaschỉ thị trình biên dịch Objective-C (mô tả ở đây ). Bạn có thể sử dụng @compatibility_aliasđể "đổi tên" một lớp, cho phép bạn đặt tên cho lớp của mình bằng FQDN hoặc một số tiền tố như vậy:

@interface COM_WHATEVER_ClassName : NSObject
@end

@compatibility_alias ClassName COM_WHATEVER_ClassName
// now ClassName is an alias for COM_WHATEVER_ClassName

@implementation ClassName //OK
//blah
@end

ClassName *myClass; //OK

Là một phần của chiến lược hoàn chỉnh, bạn có thể đặt tiền tố cho tất cả các lớp của mình bằng một tiền tố duy nhất như FQDN và sau đó tạo một tiêu đề với tất cả @compatibility_alias(tôi sẽ tưởng tượng bạn có thể tự động tạo tiêu đề đã nói).

Nhược điểm của tiền tố như thế này là bạn phải nhập tên lớp thực (ví dụ COM_WHATEVER_ClassNameở trên) vào bất cứ thứ gì cần tên lớp từ một chuỗi bên cạnh trình biên dịch. Đáng chú ý, @compatibility_aliaslà một chỉ thị của trình biên dịch, không phải là chức năng thời gian chạy nên NSClassFromString(ClassName)sẽ thất bại (trở lại nil) - bạn sẽ phải sử dụng NSClassFromString(COM_WHATERVER_ClassName). Bạn có thể sử dụng ibtoolthông qua giai đoạn xây dựng để sửa đổi tên lớp trong nib / xib của Trình tạo giao diện để bạn không phải viết COM_WHATEVER _... đầy đủ trong Trình tạo giao diện.

Thông báo cuối cùng: bởi vì đây là một chỉ thị của trình biên dịch (và một điều tối nghĩa ở đó), nên nó có thể không di động trên các trình biên dịch. Cụ thể, tôi không biết liệu nó có hoạt động với giao diện Clang từ dự án LLVM hay không, mặc dù nó sẽ hoạt động với LLVM-GCC (LLVM sử dụng giao diện GCC).


4
Upvote cho tính tương thích, tôi không biết về cái đó! Cảm ơn. Nhưng nó không giải quyết được vấn đề của tôi. Tôi không có quyền kiểm soát để thay đổi bất kỳ tiền tố nào của một trong hai khung tôi đang sử dụng, tôi chỉ có chúng ở dạng nhị phân và chúng va chạm. Tôi nên làm gì về điều đó?
Mecki

Tập tin @compabilities_alias sẽ đi trong tập tin nào (.h hoặc .m)?
Alex Basson

1
@Alex_Basson @compabilities_alias có lẽ nên đi trong tiêu đề để nó hiển thị ở bất cứ nơi nào có thể nhìn thấy khai báo @interface.
Barry Wark

Tôi tự hỏi nếu bạn có thể sử dụng @compabilities_alias với tên giao thức, hoặc định nghĩa typedef, hoặc bất cứ điều gì khác cho vấn đề đó?
Ali

Ý nghĩ tốt ở đây. Phương pháp swizzling có thể được sử dụng để ngăn NSClassFromString (ClassName) trả về nil cho các lớp bí danh không? Có lẽ khó có thể tìm thấy tất cả các phương thức lấy tên lớp.
Dickey Singh

12

Một số người đã chia sẻ một số mã thông minh và phức tạp có thể giúp giải quyết vấn đề. Một số đề xuất có thể hoạt động, nhưng tất cả chúng đều kém lý tưởng, và một số trong số chúng hết sức khó chịu để thực hiện. (Đôi khi những vụ hack xấu xí là không thể tránh khỏi, nhưng tôi cố gắng tránh chúng bất cứ khi nào tôi có thể.) Từ quan điểm thực tế, đây là những gợi ý của tôi.

  1. Trong mọi trường hợp, hãy thông báo cho các nhà phát triển của cả hai khuôn khổ của cuộc xung đột và nói rõ rằng việc họ không tránh và / hoặc giải quyết nó đang gây ra cho bạn những vấn đề kinh doanh thực sự, có thể chuyển thành doanh thu kinh doanh bị mất nếu không được giải quyết. Nhấn mạnh rằng trong khi giải quyết các xung đột hiện có trên cơ sở mỗi lớp là cách khắc phục ít xâm phạm hơn, thay đổi hoàn toàn tiền tố của họ (hoặc sử dụng một nếu chúng không hiện tại và xấu hổ về chúng!) Là cách tốt nhất để đảm bảo rằng chúng sẽ không gặp lại vấn đề tương tự
  2. Nếu các xung đột đặt tên bị giới hạn trong một nhóm các lớp nhỏ hợp lý, hãy xem liệu bạn có thể làm việc xung quanh chỉ các lớp đó không, đặc biệt nếu một trong các lớp xung đột không được sử dụng bởi mã của bạn, trực tiếp hoặc gián tiếp. Nếu vậy, hãy xem liệu nhà cung cấp sẽ cung cấp một phiên bản tùy chỉnh của khung không bao gồm các lớp xung đột. Nếu không, hãy thẳng thắn về thực tế rằng tính không linh hoạt của họ đang làm giảm ROI của bạn khỏi việc sử dụng khuôn khổ của họ. Đừng cảm thấy tồi tệ về sự thúc đẩy trong lý do - khách hàng luôn luôn đúng. ;-)
  3. Nếu một khung "dễ phân phối" hơn, bạn có thể xem xét thay thế nó bằng một khung khác (hoặc kết hợp mã), bên thứ ba hoặc homebrew. (Đây là trường hợp xấu nhất không mong muốn, vì chắc chắn sẽ phải chịu thêm chi phí kinh doanh, cho cả phát triển và bảo trì.) Nếu bạn làm vậy, hãy thông báo cho nhà cung cấp về khung đó chính xác lý do tại sao bạn quyết định không sử dụng khung của họ.
  4. Nếu cả hai khung được coi là không thể thiếu đối với ứng dụng của bạn, hãy khám phá các cách để đưa yếu tố sử dụng một trong số chúng vào một hoặc nhiều quy trình riêng biệt, có thể giao tiếp qua DO như Louis Gerbarg đề xuất. Tùy thuộc vào mức độ giao tiếp, điều này có thể không tệ như bạn mong đợi. Một số chương trình (bao gồm cả QuickTime, tôi tin) sử dụng phương pháp này để cung cấp bảo mật chi tiết hơn được cung cấp bằng cách sử dụng các cấu hình hộp cát Seatbelt trong Leopard , sao cho chỉ một tập hợp con cụ thể của mã của bạn được phép thực hiện các hoạt động quan trọng hoặc nhạy cảm. Hiệu suất sẽ là một sự đánh đổi, nhưng có thể là lựa chọn duy nhất của bạn

Tôi đoán rằng phí cấp phép, điều khoản và thời hạn có thể ngăn chặn hành động tức thời đối với bất kỳ điểm nào trong số này. Hy vọng bạn sẽ có thể giải quyết xung đột càng sớm càng tốt. Chúc may mắn!


8

Đây là tổng, nhưng bạn có thể sử dụng các đối tượng phân tán để giữ một trong các lớp chỉ trong một địa chỉ chương trình cấp dưới và RPC cho nó. Điều đó sẽ trở nên lộn xộn nếu bạn chuyển hàng tấn công cụ qua lại (và có thể không thực hiện được nếu cả hai lớp đang trực tiếp thao túng các khung nhìn, v.v.).

Có những giải pháp tiềm năng khác, nhưng rất nhiều trong số chúng phụ thuộc vào tình huống chính xác. Cụ thể, bạn đang sử dụng thời gian chạy hiện đại hay di sản, bạn béo hay kiến ​​trúc đơn, 32 hoặc 64 bit, bạn đang nhắm mục tiêu phát hành hệ điều hành nào, bạn có liên kết động, liên kết tĩnh hoặc bạn có lựa chọn nào không và có khả năng không Được rồi để làm một cái gì đó có thể yêu cầu bảo trì để cập nhật phần mềm mới.

Nếu bạn thực sự tuyệt vọng, những gì bạn có thể làm là:

  1. Không liên kết với một trong các thư viện trực tiếp
  2. Thực hiện một phiên bản thay thế của thói quen thời gian chạy objc thay đổi tên khi tải (kiểm tra dự án objc4 , chính xác những gì bạn cần làm phụ thuộc vào một số câu hỏi tôi đã hỏi ở trên, nhưng có thể là bất kể câu trả lời là gì ).
  3. Sử dụng một cái gì đó như mach_override để thực hiện triển khai mới của bạn
  4. Tải thư viện mới bằng các phương thức bình thường, nó sẽ đi qua thói quen liên kết được vá và thay đổi className của nó

Ở trên sẽ khá tốn nhiều công sức, và nếu bạn cần thực hiện nó với nhiều vòm và các phiên bản thời gian chạy khác nhau thì sẽ rất khó chịu, nhưng nó chắc chắn có thể được thực hiện để hoạt động.


4

Bạn đã cân nhắc sử dụng các hàm thời gian chạy (/usr/include/objc/r nb.h) để sao chép một trong các lớp xung đột sang một lớp không va chạm, và sau đó tải khung lớp va chạm? (điều này sẽ yêu cầu các khung va chạm được tải vào các thời điểm khác nhau để hoạt động.)

Bạn có thể kiểm tra các lớp ngà, phương thức (có tên và địa chỉ triển khai) và tên với thời gian chạy, đồng thời tự tạo một cách linh hoạt để có cùng bố cục ngà, tên phương thức / địa chỉ triển khai và chỉ khác nhau theo tên (để tránh va chạm)


3

Tình huống tuyệt vọng kêu gọi các biện pháp tuyệt vọng. Bạn đã xem xét việc hack mã đối tượng (hoặc tệp thư viện) của một trong các thư viện, thay đổi ký hiệu va chạm thành một tên thay thế - có cùng độ dài nhưng cách viết khác nhau (nhưng, khuyến nghị, cùng độ dài tên)? Vô cùng khó chịu.

Không rõ liệu mã của bạn có gọi trực tiếp hai hàm có cùng tên nhưng cách triển khai khác nhau hay xung đột là gián tiếp (cũng không rõ liệu nó có tạo ra sự khác biệt nào không). Tuy nhiên, ít nhất có một cơ hội bên ngoài rằng đổi tên sẽ hoạt động. Cũng có thể là một ý tưởng, để giảm thiểu sự khác biệt trong cách viết, để nếu các ký hiệu được sắp xếp theo thứ tự trong một bảng, việc đổi tên sẽ không làm mọi thứ mất trật tự. Những thứ như tìm kiếm nhị phân trở nên khó chịu nếu mảng họ đang tìm kiếm không theo thứ tự như mong đợi.


Thay đổi thư viện trên đĩa là không thể, bởi vì giấy phép sẽ không cho phép điều này. Có thể thay đổi các ký hiệu trong bộ nhớ, nhưng tôi không biết làm thế nào có thể thực hiện được (tải lib vào bộ nhớ, sửa đổi nó và sau đó chuyển nó đến trình liên kết động ... không thấy phương pháp nào cho điều đó).
Mecki

3
OK - thời gian để quyết định thư viện nào trong hai thư viện ít quan trọng hơn và để tìm người thay thế. Và giải thích cho người bạn trả tiền nhưng bạn đang từ bỏ rằng lý do bạn thay đổi là do sự va chạm này và họ có thể giữ lại doanh nghiệp của bạn bằng cách khắc phục vấn đề của bạn.
Jonathan Leffler

2

@compatibility_alias sẽ có thể giải quyết xung đột không gian tên lớp, vd

@compatibility_alias NewAliasClass OriginalClass;

Tuy nhiên, điều này sẽ không giải quyết bất kỳ xung đột enum, typedefs hoặc giao thức không gian tên giao thức . Hơn nữa, nó không chơi tốt với sự suy giảm @classvề phía trước của lớp ban đầu. Vì hầu hết các khung công tác sẽ đi kèm với những thứ không phải là lớp này như typedefs, nên bạn có thể không thể khắc phục vấn đề về không gian tên chỉ với tính tương thích_alias.

Tôi đã xem xét một vấn đề tương tự như của bạn , nhưng tôi đã có quyền truy cập vào nguồn và đang xây dựng các khung. Giải pháp tốt nhất tôi tìm thấy cho việc này là sử dụng có @compatibility_aliasđiều kiện với #defines để hỗ trợ enums / typedefs / giao thức / vv. Bạn có thể thực hiện điều này một cách có điều kiện trên đơn vị biên dịch cho tiêu đề đang đề cập để giảm thiểu rủi ro mở rộng nội dung trong khung va chạm khác.


1

Có vẻ như vấn đề là bạn không thể tham chiếu các tệp tiêu đề từ cả hai hệ thống trong cùng một đơn vị dịch (tệp nguồn). Nếu bạn tạo các trình bao bọc mục tiêu xung quanh các thư viện (làm cho chúng có thể sử dụng được nhiều hơn trong quy trình) và chỉ # bao gồm các tiêu đề cho mỗi thư viện trong việc thực hiện các lớp trình bao bọc, điều đó sẽ phân tách các xung đột tên một cách hiệu quả.

Tôi không có đủ kinh nghiệm với điều này trong mục tiêu-c (chỉ mới bắt đầu), nhưng tôi tin rằng đó là những gì tôi sẽ làm trong C.


1
Nhưng bạn vẫn sẽ gặp phải các xung đột nếu bạn cố gắng bao gồm cả các tiêu đề trình bao bọc trong cùng một tệp (vì mỗi tiêu đề sẽ cần bao gồm chính các tiêu đề của khung tương ứng của chúng)?
Wilco

0

Tiền tố các tập tin là giải pháp đơn giản nhất mà tôi biết. Cocoadev có một trang không gian tên là một nỗ lực của cộng đồng để tránh xung đột không gian tên. Hãy thoải mái để thêm của riêng bạn vào danh sách này, tôi tin rằng đó là những gì nó được dành cho.

http://www.cocoadev.com/index.pl?ChooseYourOwnPrefix


Làm thế nào để tiền tố các tệp giúp đỡ nếu các đối tượng được xác định trong các tệp gây ra vấn đề? Tôi chắc chắn có thể thao túng các tệp h, nhưng sau đó trình liên kết sẽ không tìm thấy các đối tượng nữa khi thích dựa vào khung: - /
Mecki

Tôi tin rằng, điều này thà là một pratice tốt nhất hơn là một giải pháp cho vấn đề ban đầu.
Ali

Điều này hoàn toàn không giải quyết được câu hỏi
Madbreaks

0

Nếu bạn có va chạm, tôi sẽ đề nghị bạn suy nghĩ kỹ về cách bạn có thể cấu trúc lại một trong các khung ra khỏi ứng dụng của bạn. Có một sự va chạm cho thấy hai người đang làm những điều tương tự như vậy, và bạn có thể có thể sử dụng một khung bổ sung chỉ bằng cách tái cấu trúc ứng dụng của bạn. Điều này không chỉ giải quyết vấn đề không gian tên của bạn mà còn giúp mã của bạn mạnh mẽ hơn, dễ bảo trì hơn và hiệu quả hơn.

Trong một giải pháp kỹ thuật hơn, nếu tôi ở vị trí của bạn, đây sẽ là lựa chọn của tôi.


0

Nếu sự va chạm chỉ ở mức liên kết tĩnh thì bạn có thể chọn thư viện nào được sử dụng để giải quyết các ký hiệu:

cc foo.o -ldog bar.o -lcat

Nếu foo.obar.ocả tài liệu tham khảo các biểu tượng ratsau đó libdogsẽ giải quyết foo.o's ratlibcatsẽ giải quyết bar.o' s rat.


0

Chỉ là một suy nghĩ .. không được kiểm tra hoặc chứng minh và có thể là cách đánh dấu nhưng bạn đã cân nhắc việc viết một bộ chuyển đổi cho lớp mà bạn sử dụng từ các khung đơn giản hơn .. hay ít nhất là các giao diện của chúng?

Nếu bạn đã viết một trình bao bọc xung quanh các khung đơn giản hơn (hoặc giao diện mà bạn truy cập ít nhất) thì sẽ không thể biên dịch trình bao bọc đó vào thư viện. Do thư viện được biên dịch trước và chỉ cần phân phối các tiêu đề của nó , Bạn sẽ ẩn hiệu quả khung công tác cơ bản và có thể tự do kết hợp nó với khung thứ hai với xung đột.

Tất nhiên tôi đánh giá cao rằng có những lúc bạn cần sử dụng lớp từ cả hai khung cùng một lúc, tuy nhiên, bạn có thể cung cấp cho các nhà máy cho các bộ điều hợp lớp tiếp theo của khung đó. Ở mặt sau của điểm đó, tôi đoán bạn cần một chút tái cấu trúc để trích xuất các giao diện bạn đang sử dụng từ cả hai khung công tác sẽ cung cấp một điểm khởi đầu tốt đẹp để bạn xây dựng trình bao bọc của mình.

Bạn có thể xây dựng thư viện như bạn và khi bạn cần thêm chức năng từ thư viện được bao bọc, và chỉ cần biên dịch lại khi bạn thay đổi.

Một lần nữa, không có cách nào được chứng minh nhưng cảm thấy như thêm một viễn cảnh. hy vọng nó giúp :)


-1

Nếu bạn có hai khung có cùng tên hàm, bạn có thể thử tải động các khung. Nó sẽ không phù hợp, nhưng có thể. Làm thế nào để làm điều đó với các lớp Objective-C, tôi không biết. Tôi đoán NSBundlelớp sẽ có các phương thức sẽ tải một lớp cụ thể.

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.