Распределенные объекты Objective-C с ARC-сервером и 32-битным прокси?
У меня есть 64-битное приложение, использующее ARC, которое обслуживает распределенный объект. Приложение, которое использует прокси-объект, является 32-битным приложением, поэтому оно не использует ARC. Это создаст проблемы для меня?
Я также хочу повторно использовать мои классы из 64-битного /ARC-приложения внутри моего 32-битного приложения. Если это ARC, как я могу интегрировать их в не-ARC приложение?
1 ответ
Я не рекомендовал бы делать это. Использование распределенных объектов между 32-битной и 64-битной средой выполнения представляется возможным, но у него есть некоторые проблемы. Из констант Фонда
До Mac OS X v10.5 NSNotFound определялся как 0x7fffffff. Для 32-битных систем это было фактически так же, как NSIntegerMax. Для поддержки 64-битных сред NSNotFound теперь формально определяется как NSIntegerMax. Это означает, однако, что значение отличается в 32-разрядных и 64-разрядных средах. Поэтому не следует сохранять значение непосредственно в файлах или архивах. Более того, отправка значения между 32-битными и 64-битными процессами через распределенные объекты не даст вам NSNotFound с другой стороны. Это относится ко всем методам Какао, вызываемым через Распределенные Объекты и которые могут возвратить NSNotFound, таким как indexOfObject: метод NSArray (если отправлено прокси для массива).
Конечно, вы можете выполнить некоторые базовые проверки работоспособности -[NSArray indexOfObject:], но что если любая используемая вами библиотека или инфраструктура (включая Cocoa и Foundation) использует API, который может возвращать NSNotFound? Не говоря уже о том, что это только одна проблема, которая может возникнуть при обмене данными между 32- и 64-разрядными средами выполнения, а другие проблемы могут быть не задокументированы.
Я склонен уклоняться от распределенных объектов из-за некоторых других их проблем, но даже если вы решили использовать их, мне это кажется нарушителем.
Я не верю, что в ARC есть что-то, что помешало бы вам использовать ARC и Distributed Objects вместе. Однако управление памятью с распределенными объектами может быть сложным. Если вам необходимо нарушить стандартные правила хранения-выпуска, чтобы обойти утечку памяти между клиентом и сервером, ARC не позволит вам сделать это. Вы должны быть очень осторожны, чтобы спроектировать свой сервер, чтобы избежать этого.
Наконец, поскольку вы не можете использовать ARC в 32-разрядной среде выполнения, вам придется написать код сохранения / выпуска для этих классов вручную. Если вы планируете в конечном итоге отойти от не-ARC-кода, вы можете воспользоваться преимуществом __has_feature (objc_arc). В противном случае, вероятно, лучше не использовать ARC для файлов, которые вы планируете использовать в 32- и 64-разрядных приложениях. ARC может быть включен или отключен для каждого файла отдельно.