উদ্দেশ্য-সি নামস্থান সংঘর্ষের সমাধানের সর্বোত্তম উপায় কী?


174

উদ্দেশ্য-সি এর কোন নামস্থান নেই; এটি অনেকটা সি এর মতো, সমস্ত কিছুই এক গ্লোবাল নেমস্পেসের মধ্যে। সাধারণ অনুশীলন হ'ল আদ্যক্ষর সহ ক্লাসের উপসর্গ করা, যেমন আপনি যদি আইবিএম-এ কাজ করছেন, আপনি তাদের "আইবিএম" দিয়ে উপসর্গ করতে পারেন; আপনি যদি মাইক্রোসফ্টের হয়ে কাজ করেন তবে আপনি "এমএস" ব্যবহার করতে পারেন; ইত্যাদি। কখনও কখনও প্রারম্ভিক প্রকল্পটি বোঝায়, যেমন "এআই" এর সাথে অ্যাডিয়াম উপসর্গের ক্লাস (যেমন এর পিছনে কোনও সংস্থা নেই যে আপনি আদ্যক্ষর নিতে পারতেন)। অ্যাপল এনএস সহ ক্লাস করে এবং বলে যে এই উপসর্গটি কেবল অ্যাপলের জন্য সংরক্ষিত।

এখন পর্যন্ত এত ভাল। তবে সামনের শ্রেণীর নামের সাথে 2 থেকে 4 টি অক্ষর যুক্ত করা খুব, খুব সীমাবদ্ধ নেমস্পেস। যেমন এমএস বা এআই এর সম্পূর্ণ আলাদা অর্থ হতে পারে (উদাহরণস্বরূপ এআই কৃত্রিম বুদ্ধিমত্তা হতে পারে) এবং অন্য কোনও বিকাশকারী সেগুলি ব্যবহার করার সিদ্ধান্ত নিতে পারে এবং একটি সমান নামযুক্ত বর্গ তৈরি করতে পারে। ব্যাং , নেমস্পেসের সংঘর্ষ।

ঠিক আছে, যদি এটি আপনার নিজের শ্রেণীর মধ্যে একটি এবং আপনি যে বাহ্যিক কাঠামো ব্যবহার করছেন তার মধ্যে একটির সংঘর্ষ হয় তবে আপনি সহজেই আপনার শ্রেণির নাম পরিবর্তন করতে পারেন, কোনও বড় বিষয় নয়। তবে আপনি যদি দুটি বাহ্যিক ফ্রেমওয়ার্ক ব্যবহার করেন তবে উভয় ফ্রেমওয়ার্ক যা আপনার উত্স নেই এবং আপনি পরিবর্তন করতে পারবেন না? আপনার অ্যাপ্লিকেশনটি উভয়ের সাথে লিঙ্ক করে এবং আপনি নাম দ্বন্দ্ব পান। কীভাবে আপনি এগুলি সমাধান করবেন? তাদের চারপাশে এমনভাবে কাজ করার সর্বোত্তম উপায় কী যে আপনি এখনও উভয় ক্লাস ব্যবহার করতে পারেন?

সিতে আপনি সরাসরি লাইব্রেরির সাথে সংযুক্ত না হয়ে এগুলির চারপাশে কাজ করতে পারেন, পরিবর্তে আপনি রানটাইমের সময় লাইব্রেরিটি লোডেন () ব্যবহার করে লোড করেন, তারপরে আপনি যে প্রতীকটি সন্ধান করছেন সন্ধান করুন dlsym () ব্যবহার করে এবং এটি একটি বিশ্বব্যাপী প্রতীককে নির্ধারণ করুন (যে আপনি আপনার যে কোনও উপায়ে নাম লিখতে পারেন) এবং তারপরে এটি বিশ্বব্যাপী প্রতীকটির মাধ্যমে অ্যাক্সেস করুন। উদাহরণস্বরূপ, যদি আপনার কোনও বিরোধ থাকে কারণ কিছু সি লাইব্রেরির ফাংশন ওপেন () নামে থাকে তবে আপনি মাইওপেন নামের একটি ভেরিয়েবলটি সংজ্ঞায়িত করতে পারেন এবং এটি লাইব্রেরির খোলা () ফাংশনটির দিকে নির্দেশ করতে পারেন, সুতরাং আপনি যখন সিস্টেমটি উন্মুক্ত () ব্যবহার করতে চান , আপনি কেবল উন্মুক্ত () ব্যবহার করেন এবং আপনি অন্যটি ব্যবহার করতে চাইলে আপনি মাইওপেন শনাক্তকারীর মাধ্যমে এটি অ্যাক্সেস করতে পারেন।

উদ্দেশ্য-সি-তেও কি একই রকম কিছু সম্ভব এবং যদি তা না হয়, তবে অন্য কোনও চালক, কূটকৌশলযুক্ত সমাধান কি আপনি নামটির জায়গার বিরোধগুলি সমাধান করতে পারবেন? কোন ধারনা?


হালনাগাদ:

কেবল এটি স্পষ্ট করার জন্য: যে উত্তরগুলি কীভাবে আগে থেকেই নেমস্পেসের সংঘর্ষগুলি এড়ানো যায় বা কীভাবে একটি আরও ভাল নামস্থান তৈরি করা যায় তা অবশ্যই স্বাগত জানায়; তবে তারা আমার সমস্যার সমাধান না করায় আমি তাদের উত্তর হিসাবে গ্রহণ করব না । আমার দুটি গ্রন্থাগার রয়েছে এবং তাদের শ্রেণির নাম সংঘর্ষে লিপ্ত হয়। আমি তাদের পরিবর্তন করতে পারি না; আমার একটিরও উত্স নেই। সংঘর্ষটি ইতিমধ্যে রয়েছে এবং এটি আগে থেকে কীভাবে এড়ানো যেত তার টিপস আর সাহায্য করবে না। আমি তাদের এই ফ্রেমওয়ার্কগুলির বিকাশকারীদের কাছে ফরোয়ার্ড করতে পারি এবং আশা করি তারা ভবিষ্যতে আরও ভাল নামের জায়গাটি বেছে নেবে, তবে আপাতত আমি একক প্রয়োগের মধ্যে এই মুহূর্তে ফ্রেমওয়ার্কগুলি নিয়ে কাজ করার একটি সমাধান অনুসন্ধান করছি। এটি সম্ভব করার কোনও সমাধান?


7
আপনার একটি ভাল প্রশ্ন রয়েছে (আপনার যদি দুটি ফ্রেমের কাঠামোর প্রয়োজন হয় তবে কী করতে হবে যার নাম সংঘর্ষ রয়েছে) তবে এটি পাঠ্যে সমাহিত করা হয়েছে। এটি আরও পরিষ্কার করার জন্য সংশোধন করুন এবং আপনি এখন যেমন উত্তর দিয়েছেন তেমন সরল উত্তর এড়াতে পারবেন।
বেনজাদো

4
ওজেক্টিভ-সি ভাষার বর্তমান ডিজাইনের সাথে এটি আমার সবচেয়ে বড় গ্রিপ। নীচের উত্তরগুলি দেখুন; প্রকৃতপক্ষে যারা প্রশ্নটিকে সম্বোধন করে (এনএসবান্ডেল আনলোডিং, ডিও ইত্যাদি ব্যবহার করে) হ'ল হ্যাকস যা হ'ল নাম স্থানের দ্বন্দ্ব এড়ানো হিসাবে তুচ্ছ হিসাবে কিছু প্রয়োজন হয় না।
এরিকপ্রাইস

@ এরিকপ্রাইস: আমেন। আমি আপত্তি-সি শিখছি, এবং এই বিষয়টি খুব হিট করেছি। একটি সহজ সমাধান খুঁজছেন এখানে এসেছেন .... খোঁড়া।
ডেভ মাতোর

1
রেকর্ডের জন্য, প্রযুক্তিগতভাবে উভয় সি এবং অবজেক্টিভ-সি একাধিক নামের জায়গাগুলির জন্য সমর্থন সরবরাহ করে - যদিও ওপি অনুসন্ধান করছে ঠিক তা নয়। দেখুন objectivistc.tumblr.com/post/3340816080/...

হুম, আমি এটা জানতাম না। কোন ভয়ঙ্কর ডিজাইনের সিদ্ধান্তের কোন সিদ্ধান্ত নেই?
নিকো

উত্তর:


47

যদি আপনাকে একই সাথে উভয় ফ্রেমওয়ার্ক থেকে ক্লাস ব্যবহার করার প্রয়োজন না হয় এবং আপনি এমন প্ল্যাটফর্মগুলি লক্ষ্য করছেন যা এনএসবান্ডেল আনলোডিং (ওএস এক্স 10.4 বা তার পরে, কোনও জিএনএসটপ সমর্থন নয়) সমর্থন করে, এবং কার্য সম্পাদন সত্যই আপনার পক্ষে কোনও সমস্যা নয়, আমি বিশ্বাস করি যে আপনি যখনই এটি থেকে কোনও ক্লাস ব্যবহার করার প্রয়োজন হবে তখনই আপনি একটি কাঠামো লোড করতে পারেন এবং তারপরে এটি আনলোড করুন এবং অন্য ফ্রেমওয়ার্কটি ব্যবহার করার দরকার হলে অন্যটিকে লোড করতে পারেন।

আমার প্রাথমিক ধারণাটি ছিল ফ্রেমওয়ার্কগুলির একটি লোড করার জন্য এনএসবান্ডেল ব্যবহার করা, তারপরে সেই কাঠামোর ভিতরে থাকা ক্লাসগুলির অনুলিপি বা নামকরণ এবং অন্য ফ্রেমওয়ার্কটি লোড করা। এটি নিয়ে দুটি সমস্যা রয়েছে। প্রথমত, কোনও শ্রেণীর নাম পরিবর্তন বা অনুলিপি করার জন্য নির্দেশিত ডেটা অনুলিপি করার জন্য আমি কোনও ফাংশন খুঁজে পাইনি, এবং সেই প্রথম কাঠামোর অন্য কোনও শ্রেণীর নাম বদলে দেওয়া ক্লাসটি এখন অন্য কাঠামো থেকে শ্রেণিকে রেফারেন্স করবে।

কোনও আইএমপি দ্বারা নির্দেশিত ডেটা অনুলিপি করার কোনও উপায় থাকলে আপনাকে কোনও শ্রেণীর অনুলিপি বা নামকরণের প্রয়োজন হবে না। আপনি একটি নতুন শ্রেণী তৈরি করতে পারেন এবং তারপরে আইভারগুলি, পদ্ধতিগুলি, বৈশিষ্ট্য এবং বিভাগগুলিতে অনুলিপি করতে পারেন। আরও অনেক কাজ, তবে এটি সম্ভব। তবে, ভুল ক্লাসটি উল্লেখ করে ফ্রেমওয়ার্কে অন্য শ্রেণীর সাথে আপনার এখনও সমস্যা হবে।

সম্পাদনা: সি এবং অবজেক্টিভ-সি রানটাইমের মধ্যে মৌলিক পার্থক্যটি হ'ল লাইব্রেরিগুলি যখন লোড করা হয় তখন libra গ্রন্থাগারগুলির ফাংশনগুলিতে তারা উল্লেখ করা কোনও চিহ্নের পয়েন্টার ধারণ করে, যেখানে উদ্দেশ্য-সিতে তাদের স্ট্রিং উপস্থাপনা থাকে thsee চিহ্নের নাম। সুতরাং, আপনার উদাহরণে, আপনি dlsym ব্যবহার করে স্মৃতিতে চিহ্নের ঠিকানা পেতে এবং এটি অন্য চিহ্নের সাথে সংযুক্ত করতে পারেন। গ্রন্থাগারের অন্যান্য কোডটি এখনও কাজ করে কারণ আপনি মূল চিহ্নের ঠিকানা পরিবর্তন করছেন না। উদ্দেশ্য-সি ঠিকানাগুলিতে শ্রেণীর নামগুলি ম্যাপ করতে একটি সন্ধানের টেবিল ব্যবহার করে এবং এটি 1-1 ম্যাপিং, যাতে আপনার একই নামের দুটি শ্রেণি থাকতে পারে না। সুতরাং, উভয় শ্রেণি লোড করতে, তাদের একটির অবশ্যই তাদের নাম পরিবর্তন করা উচিত। যাইহোক, যখন অন্য শ্রেণিগুলিতে সেই নাম সহ ক্লাসগুলির মধ্যে একটিতে অ্যাক্সেসের প্রয়োজন হয়,


5
আমি বিশ্বাস করি বান্ডিল আনলোড 10.5 বা তার পরে অবধি অসমর্থিত।
কুইন টেলর

93

একটি অনন্য উপসর্গ দিয়ে আপনার ক্লাসের উপসর্গ করা মৌলিকভাবে একমাত্র বিকল্প তবে এটি আরও কম ও কুৎসিত করার বিভিন্ন উপায় রয়েছে। বিকল্পগুলির একটি দীর্ঘ আলোচনা এখানে আছে । আমার প্রিয় @compatibility_aliasউদ্দেশ্যটি সি-সংকলক নির্দেশিকা ( এখানে বর্ণিত )। আপনি @compatibility_aliasFQDN বা এই জাতীয় কিছু উপসর্গ ব্যবহার করে আপনার শ্রেণীর নামকরণের অনুমতি দিয়ে একটি শ্রেণীর "নাম পরিবর্তন" করতে ব্যবহার করতে পারেন :

@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

একটি সম্পূর্ণ কৌশলটির অংশ হিসাবে, আপনি আপনার সমস্ত ক্লাসগুলি এফকিউডিএন এর মতো একটি অনন্য উপসর্গ দিয়ে উপসর্গ করতে পারেন এবং তারপরে সমস্তটি দিয়ে একটি শিরোনাম তৈরি @compatibility_aliasকরতে পারেন (আমি ভাবতে পারি যে আপনি হেডারে স্বয়ংক্রিয়ভাবে উত্পন্ন করতে পারবেন)।

এর মতো প্রিফিক্সিংয়ের অবক্ষয়টি হ'ল আপনাকে COM_WHATEVER_ClassNameসংকলক ছাড়াও স্ট্রিং থেকে শ্রেণীর নাম প্রয়োজন এমন যে কোনও কিছুতে সত্য বর্গের নাম (যেমন উপরে) লিখতে হবে। উল্লেখযোগ্যভাবে, @compatibility_aliasএকটি সংকলক নির্দেশিকা, একটি রানটাইম ফাংশন নয় তাই NSClassFromString(ClassName)ব্যর্থ হবে (প্রত্যাবর্তন nil) - আপনাকে ব্যবহার করতে হবে NSClassFromString(COM_WHATERVER_ClassName)। আপনি ibtoolইন্টারফেস বিল্ডার nib / xib এর ক্লাসের নামগুলি সংশোধন করতে বিল্ড ফেজের মাধ্যমে ব্যবহার করতে পারেন যাতে আপনাকে ইন্টারফেস বিল্ডারে সম্পূর্ণ COM_WHATEVER _... লিখতে না হয়।

চূড়ান্ত সতর্কতা: যেহেতু এটি একটি সংকলক নির্দেশিকা (এবং এটিতে একটি অস্পষ্ট একটি), এটি সংকলকগুলিতে পোর্টেবল নাও হতে পারে। বিশেষত, আমি জানি না এটি এলএলভিএম প্রকল্পের ক্ল্যাং ফ্রন্ট্যান্ডের সাথে কাজ করে কিনা, যদিও এটি এলএলভিএম-জিসিসি (জিসিসি ফ্রন্ট্যান্ড ব্যবহার করে এলএলভিএম) দিয়ে কাজ করা উচিত।


4
সামঞ্জস্যের জন্য উত্সাহ দিন_লিয়াস, আমি সেই সম্পর্কে জানতাম না! ধন্যবাদ। তবে এটি আমার সমস্যার সমাধান করে না। আমি যে ফ্রেমওয়ার্ক ব্যবহার করছি তার কোনও উপসর্গ পরিবর্তন করার নিয়ন্ত্রণে নেই, আমার কেবল সেগুলি বাইনারি আকারে রয়েছে এবং তারা সংঘর্ষে লিপ্ত হয়। সে সম্পর্কে আমার কী করা উচিত?
মক্কি

কোন ফাইলটিতে (। ঘন্টা বা। মি) @ কম্প্যাটিবিলিটি_লিয়াস লাইনটি যাওয়া উচিত?
অ্যালেক্স বাসন

1
@ অ্যালেক্স_বাসন @ সামঞ্জস্যতা_লিয়াদের সম্ভবত শিরোনামে যাওয়া উচিত যাতে এটি যেখানে যেখানে @ আন্তঃ পৃষ্ঠের ঘোষণাটি দৃশ্যমান থাকে সেখানে দৃশ্যমান হয়।
ব্যারি ওয়ার্ক

আমি ভাবছি আপনি যদি প্রোটোকল নাম, বা টাইপডেফ সংজ্ঞা, বা এই বিষয়টির জন্য অন্য কোনও কিছুর সাথে @ সামঞ্জস্যতা_লিয়াস ব্যবহার করতে পারেন?
আলী

এখানে ভাল চিন্তা। NSClassFromString (ClassName) কে এলিয়াসযুক্ত ক্লাসে ফিরে যাওয়া থেকে রোধ করার জন্য কী সুইজলিং পদ্ধতি ব্যবহার করা যেতে পারে? কোনও শ্রেণীর নাম নিয়েছিল এমন সমস্ত পদ্ধতি সম্ভবত পাওয়া শক্ত হবে।
ডিকি সিং

12

বেশ কিছু লোক ইতিমধ্যে কিছু ছদ্মবেশী এবং চতুর কোড ভাগ করে নিয়েছে যা সমস্যা সমাধানে সহায়তা করতে পারে। কিছু প্রস্তাবনাগুলি কার্যকর হতে পারে তবে সেগুলির সবগুলিই আদর্শের চেয়ে কম এবং তাদের কিছুগুলি বাস্তবায়নের জন্য নিখুঁত বাজে। (কখনও কখনও কুৎসিত হ্যাকগুলি অনিবার্য হয়, তবে আমি যখনই পারি এগুলি এড়াতে চেষ্টা করি a) ব্যবহারিক দৃষ্টিকোণ থেকে, আমার পরামর্শগুলি এখানে।

  1. যাই হোক না কেন, দ্বন্দ্বের উভয় কাঠামোর বিকাশকারীকে অবহিত করুন এবং এটি পরিষ্কার করুন যে এটি এড়াতে এবং / অথবা এটির মোকাবেলা করতে তাদের ব্যর্থতা আপনাকে প্রকৃত ব্যবসায়িক সমস্যা তৈরি করছে, যা যদি সমাধান না করা হয় তবে ব্যবসায়ের ক্ষতি হ্রাসে অনুবাদ হতে পারে। জোর দিয়ে বলুন যে প্রতি বর্গ ভিত্তিতে বিদ্যমান দ্বন্দ্বগুলি সমাধান করার সময় একটি অল্প অনুপ্রেরণীয় সমাধান, তাদের উপসর্গ পুরোপুরি পরিবর্তন করা (বা তারা বর্তমানে না থাকলে একটি ব্যবহার করে এবং তাদের জন্য লজ্জা!) তারা নিশ্চিত না করার সর্বোত্তম উপায় আবার একই সমস্যা দেখুন।
  2. যদি নামকরণের দ্বন্দ্বগুলি ক্লাসের যুক্তিসঙ্গতভাবে ছোট ছোট সংখ্যায় সীমাবদ্ধ থাকে তবে দেখুন যে আপনি কেবল সেই ক্লাসগুলির চারপাশে কাজ করতে পারেন কিনা, বিশেষত যদি কোনও বিরোধী ক্লাস আপনার কোড দ্বারা প্রত্যক্ষ বা পরোক্ষভাবে ব্যবহার করা হয় না। যদি তা হয় তবে দেখুন যে বিক্রেতা ফ্রেমওয়ার্কটির একটি কাস্টম সংস্করণ সরবরাহ করবে যা বিরোধী ক্লাসগুলিকে অন্তর্ভুক্ত করে না। যদি তা না হয় তবে এই কথাটি স্পষ্ট করে বলুন যে তাদের অবিচ্ছিন্নতা আপনার আরওআইকে তাদের কাঠামোর ব্যবহার থেকে হ্রাস করছে। কারণের মধ্যে পুসি হওয়া সম্পর্কে খারাপ বোধ করবেন না - গ্রাহক সর্বদা সঠিক থাকেন। ;-)
  3. যদি একটি কাঠামোটি আরও "বিতরণযোগ্য" হয় তবে আপনি এটির পরিবর্তে অন্য ফ্রেমওয়ার্ক (বা কোডের সংমিশ্রণ), তৃতীয় পক্ষ বা হোমব্রিউ হিসাবে বিবেচনা করতে পারেন। (পরেরটিটি অনাকাঙ্ক্ষিত সবচেয়ে খারাপ পরিস্থিতি, যেহেতু এটি অবশ্যই বিকাশ এবং রক্ষণাবেক্ষণের জন্য অতিরিক্ত ব্যবসায়িক ব্যয় বহন করবে।) আপনি যদি তা করেন তবে কেন আপনি তাদের কাঠামোটি ব্যবহার না করার সিদ্ধান্ত নিয়েছিলেন সেই কাঠামোর বিক্রেতাকে অবহিত করুন।
  4. যদি উভয় ফ্রেমওয়ার্কগুলি আপনার আবেদনের জন্য সমানভাবে অপরিহার্য বলে মনে করা হয়, তবে লুই জারবার্গের পরামর্শ অনুসারে ডিও এর মাধ্যমে যোগাযোগ করে, এক বা একাধিক পৃথক প্রক্রিয়ার মধ্যে একটির ব্যবহারের কারণ নির্ধারণের উপায়গুলি সন্ধান করুন। যোগাযোগের ডিগ্রির উপর নির্ভর করে, এটি আপনার প্রত্যাশার মতো খারাপ হতে পারে না। বেশ কয়েকটি প্রোগ্রাম (কুইকটাইম সহ, আমি বিশ্বাস করি) চিতাবাঘের সিয়াটবেল্ট স্যান্ডবক্স প্রোফাইল ব্যবহার করে সরবরাহ করা আরও দানাদার সুরক্ষা সরবরাহ করার জন্য এই পদ্ধতির ব্যবহার করে যেমন আপনার কোডের একটি নির্দিষ্ট উপসেটকে সমালোচনা বা সংবেদনশীল ক্রিয়াকলাপ সম্পাদনের অনুমতি দেওয়া হয়। পারফরম্যান্স একটি ট্রেড অফ হবে তবে এটি আপনার একমাত্র বিকল্প হতে পারে

আমি অনুমান করছি যে লাইসেন্স ফি, শর্তাদি এবং সময়সীমাগুলি এই পয়েন্টগুলির যে কোনওটিতে তাত্ক্ষণিক পদক্ষেপ রোধ করতে পারে। আশা করি আপনি যত তাড়াতাড়ি সম্ভব দ্বন্দ্ব সমাধান করতে সক্ষম হবেন। শুভকামনা!


8

এটি মোটামুটি, তবে ক্লাসগুলির মধ্যে একটিকে কেবল অধস্তন প্রোগ্রামের ঠিকানায় এবং আরপিসিতে রাখার জন্য আপনি বিতরণ করা অবজেক্টগুলি ব্যবহার করতে পারেন । যদি আপনি পিছনে পিছনে এক টন স্টাফ পাস করে থাকেন তবে তা অগোছালো হয়ে উঠবে (এবং উভয় শ্রেণি যদি সরাসরি দৃষ্টিগোচর হয় ইত্যাদি ইত্যাদিও সম্ভব না)।

অন্যান্য সম্ভাব্য সমাধান রয়েছে, তবে তাদের অনেকগুলি নির্ভর করে সঠিক পরিস্থিতির উপর। বিশেষত, আপনি কি আধুনিক বা লেগ্যাসি রানটাইমগুলি ব্যবহার করছেন, আপনি কি মোটা বা একক আর্কিটেকচার, 32 বা 64 বিট, ওএস প্রকাশনাগুলি আপনি কী টার্গেট করছেন, আপনি কি গতিশীলভাবে সংযোগ করছেন, স্থিরভাবে সংযুক্ত করছেন, বা আপনার কোনও পছন্দ আছে, এবং এটি সম্ভবত সম্ভাব্য? ঠিক আছে এমন কিছু করার জন্য যাতে নতুন সফ্টওয়্যার আপডেটগুলির রক্ষণাবেক্ষণের প্রয়োজন হতে পারে।

আপনি যদি সত্যিই মরিয়া হয়ে থাকেন তবে আপনি যা করতে পারতেন তা হ'ল:

  1. সরাসরি কোনও লাইব্রেরির সাথে লিঙ্ক নয়
  2. লোড সময় নাম বদলে দেয় যাজেক্ট রানটাইম রুটিনের একটি বিকল্প সংস্করণ প্রয়োগ করুন ( আপত্তি 4 প্রকল্পটি চেক আউট করুন , আপনাকে ঠিক কী করতে হবে আমি উপরে জিজ্ঞাসা করা বেশ কয়েকটি প্রশ্নের উপর নির্ভর করে, তবে উত্তরগুলি কী তা বিবেচনা না করেই এটি সম্ভব হওয়া উচিত) )।
  3. আপনার নতুন বাস্তবায়ন ইনজেক্ট করতে mach_override এর মতো কিছু ব্যবহার করুন
  4. সাধারণ পদ্ধতি ব্যবহার করে নতুন লাইব্রেরিটি লোড করুন, এটি প্যাচযুক্ত লিঙ্কার রুটিনের মধ্য দিয়ে যাবে এবং এর শ্রেণিকামটি পরিবর্তিত করবে

উপরেরটি শ্রম নিবিড় হতে চলেছে, এবং যদি আপনি এটি একাধিক খিলান এবং বিভিন্ন রানটাইম সংস্করণের বিপরীতে প্রয়োগ করতে হয় তবে এটি খুব অপ্রীতিকর হবে, তবে এটি অবশ্যই কার্যকরভাবে তৈরি করা যেতে পারে।


4

আপনি কি কোনও দ্বন্দ্বী ক্লাসকে একটি অ-সংঘাতকারী শ্রেণিতে ক্লোন করার জন্য রানটাইম ফাংশন (/usr/incolve/objc/runtime.h) ব্যবহার করে এবং তার পরে সংঘর্ষক শ্রেণীর কাঠামোটি লোড করার কথা বিবেচনা করেছেন? (এর জন্য কাজ করার জন্য সংঘর্ষের কাঠামোগুলি বিভিন্ন সময়ে লোড করা প্রয়োজন))

আপনি ক্লাস আইভারগুলি, পদ্ধতিগুলি (নাম এবং বাস্তবায়ন ঠিকানা সহ) এবং রানটাইম সহ নামগুলি পর্যবেক্ষণ করতে পারেন এবং একই আইভার বিন্যাস, পদ্ধতিগুলির নাম / প্রয়োগের ঠিকানা এবং নিজের নামের সাথে পৃথক করতে গতিশীলভাবে নিজের তৈরি করতে পারেন (এড়াতে সংঘর্ষের)


3

মরিয়া পরিস্থিতিগুলি মরিয়া পদক্ষেপ নেওয়ার আহ্বান জানায়। আপনি কি কোনও লাইব্রেরির অবজেক্ট কোড (বা লাইব্রেরি ফাইল) হ্যাকিং, সংঘর্ষের প্রতীকটিকে বিকল্প নামে পরিবর্তিত করে - একই দৈর্ঘ্যের ভিন্ন ভিন্ন বানান (তবে সুপারিশ, নামের একই দৈর্ঘ্য) বিবেচনা করেছেন? অন্তর্নিহিত কদর্য।

আপনার কোডটি সরাসরি একই নামের সাথে দুটি ফাংশনটি কল করছে তবে ভিন্ন ভিন্ন বাস্তবায়ন বা দ্বন্দ্ব পরোক্ষ কিনা তা স্পষ্ট নয় (এটি কোনও তফাত করে কিনা তাও পরিষ্কার নয়)। যাইহোক, কমপক্ষে বাইরের সম্ভাবনা রয়েছে যা নামকরণে কাজ করবে। বানানের পার্থক্য হ্রাস করার জন্য এটিও একটি ধারণা হতে পারে, যাতে চিহ্নগুলি যদি একটি সারণিতে সাজানো ক্রমে থাকে তবে নাম পরিবর্তনগুলি জিনিসকে ক্রম থেকে সরিয়ে না দেয়। বাইনারি অনুসন্ধানের মতো জিনিসগুলি যদি তারা অনুসন্ধান করে এমন অ্যারে প্রত্যাশার মতো সাজানো ক্রমে না থাকে তবে বিচলিত হয়।


ডিস্কে লাইব্রেরি পরিবর্তন করা প্রশ্নবিদ্ধ নয়, কারণ লাইসেন্স এটির অনুমতি দেয় না। মেমোরিতে প্রতীকগুলি পরিবর্তন করা সম্ভব হবে, তবে এটি কীভাবে করা যায় তার কোনও উপায় আমি দেখতে পাই না (মেমরিটিতে lib লোড করা, এটি পরিবর্তন করা এবং এটি ডায়নামিক লিঙ্কারে পাস করা ... এর জন্য কোনও পদ্ধতি দেখুন)।
মক্কি

3
ঠিক আছে - দুটি গ্রন্থাগারের মধ্যে কোনটি কম গুরুত্বপূর্ণ তা সিদ্ধান্ত নেওয়ার এবং একটি প্রতিস্থাপন সন্ধানের জন্য সময় আপনি যার জন্য অর্থ প্রদান করেছেন তার ব্যাখ্যা করুন কিন্তু আপনি যে পরিবর্তন করছেন তার কারণ এই সংঘর্ষের কারণ এবং তারা আপনার সমস্যাটি সমাধান করে আপনার ব্যবসা বজায় রাখতে পারে।
জোনাথন লেফলার 21

2

@compatibility_alias শ্রেণীর নেমস্পেস দ্বন্দ্বগুলি সমাধান করতে সক্ষম হবে, যেমন

@compatibility_alias NewAliasClass OriginalClass;

তবে এটি কোনও এনাম, টাইপিড, বা প্রোটোকল নেমস্পেস সংঘর্ষের সমাধান করবে না@classতদতিরিক্ত, এটি মূল শ্রেণীর ফরোয়ার্ড ডিক্সের সাথে ভাল খেলছে না play যেহেতু বেশিরভাগ ফ্রেমওয়ার্কগুলি টাইপডিফগুলির মতো এই অ-শ্রেণীর জিনিসগুলি নিয়ে আসবে, আপনি সম্ভবত সামঞ্জস্যতা_লিয়াসের সাথে নেমস্পেসিং সমস্যাটি ঠিক করতে সক্ষম হবেন না।

আমি আপনার অনুরূপ সমস্যার দিকে তাকিয়েছিলাম , তবে আমার উত্সে অ্যাক্সেস ছিল এবং ফ্রেমওয়ার্কগুলি তৈরি করা হয়েছিল। এর জন্য আমি যে সর্বোত্তম সমাধানটি পেয়েছি তা হ'ল @compatibility_aliasএনডাম / টাইপিডেফস / প্রোটোকলস / ইত্যাদি সমর্থন করার জন্য # শর্তাবলীর সাথে শর্তযুক্তভাবে ব্যবহার করা । অন্যান্য সংঘাতের কাঠামোর কাঠামোর প্রসারণের ঝুঁকি হ্রাস করতে আপনি শর্তাধীন শিরোনামের জন্য সংকলন ইউনিটে শর্তসাপেক্ষে এটি করতে পারেন।


1

দেখে মনে হচ্ছে যে সমস্যাটি হ'ল আপনি একই অনুবাদ ইউনিটে (উত্স ফাইল) উভয় সিস্টেমের হেডার ফাইলগুলি উল্লেখ করতে পারবেন না। আপনি যদি লাইব্রেরিগুলির চারপাশে অবজেক্টিভ সি-র‌্যাপগুলি তৈরি করেন (এগুলি আরও কার্যকরভাবে প্রক্রিয়ায় পরিণত করা হয়) এবং কেবলমাত্র র‌্যাপার ক্লাসগুলি প্রয়োগের জন্য প্রতিটি লাইব্রেরির শিরোনাম অন্তর্ভুক্ত করুন, এটি কার্যকরভাবে নামের সংঘর্ষকে পৃথক করবে would

উদ্দেশ্য-সিতে এটির সাথে আমার যথেষ্ট অভিজ্ঞতা নেই (সবে শুরু করা) তবে আমি বিশ্বাস করি এটি সিতে আমি যা করতাম is


1
আপনি যদি একই ফাইলটিতে উভয় মোড়কের শিরোনামকে অন্তর্ভুক্ত করার চেষ্টা করেন তবে আপনি কি সংঘর্ষে দৌড়াবেন না (যেহেতু তাদের প্রত্যেককেই তাদের নিজ নিজ কাঠামোর শিরোনামটি নিজেরাই অন্তর্ভুক্ত করতে হবে)?
উইলকো

0

ফাইলগুলির পূর্বনির্ধারণ করা সহজ সমাধান যা আমি সচেতন। কোকোদেবের একটি নেমস্পেস পৃষ্ঠা রয়েছে যা নাম স্থানের সংঘর্ষ এড়াতে একটি সম্প্রদায় প্রচেষ্টা। এই তালিকায় আপনার নিজের যোগ করতে নির্দ্বিধায়, আমি বিশ্বাস করি যে এটিই এর জন্য।

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


যদি ফাইলগুলির মধ্যে সংজ্ঞায়িত অবজেক্টগুলি সমস্যার কারণ হয়ে থাকে তবে ফাইলগুলির উপসর্গ কীভাবে সহায়তা করবে? আমি অবশ্যই এইচ ফাইলগুলি পরিচালনা করতে পারি, তবে তারপরে লিঙ্কার ফ্রেমওয়ার্কের সাথে পছন্দ করার মতো জিনিসগুলি আর খুঁজে পাবে না: - /
মক্কি

আমি বিশ্বাস করি, এটি প্রাথমিক সমস্যার সমাধানের চেয়ে বরং সেরা rat
আলী


0

আপনার যদি কোনও সংঘর্ষ হয়, তবে আমি আপনাকে আপনার অ্যাপ্লিকেশনটির বাইরে কোনও ফ্রেমওয়ার্ককে কীভাবে চুল্লি করতে পারে সে সম্পর্কে কঠোর চিন্তা করার পরামর্শ দিচ্ছি suggest সংঘর্ষ হওয়ার ফলে পরামর্শ দেওয়া হচ্ছে যে দু'জন একই রকম কাজ করছে এবং আপনি সম্ভবত নিজের অ্যাপ্লিকেশনটি রিফ্যাক্ট করে অতিরিক্ত কাঠামো ব্যবহার করতে পারেন। এটি কেবল আপনার নামস্থান সমস্যার সমাধান করবে না, তবে এটি আপনার কোডকে আরও দৃust়, বজায় রাখা সহজ এবং আরও দক্ষ করে তুলবে।

আরও প্রযুক্তিগত সমাধানের পরে, আমি যদি আপনার অবস্থানে থাকি তবে এটি আমার পছন্দ হবে।


0

যদি সংঘর্ষটি কেবল স্থির লিঙ্ক স্তরে হয় তবে আপনি চিহ্নগুলি সমাধান করতে কোন লাইব্রেরি ব্যবহৃত হবে তা চয়ন করতে পারেন:

cc foo.o -ldog bar.o -lcat

যদি foo.oএবং bar.oউভয় রেফারেন্স প্রতীক ratতারপর libdogসমাধান হবে foo.oএর ratএবং libcatসমাধান হবে bar.o's rat


0

কেবল একটি চিন্তার .. পরীক্ষিত বা প্রমাণিত নয় এবং এটি চিহ্নের উপায় হতে পারে তবে আপনি ক্লাসটির ফ্রেমওয়ার্কগুলির সহজ থেকে ব্যবহার করেছেন এমন কোনও অ্যাডাপ্টার লেখার বিষয়ে বিবেচনা করেছেন .. বা কমপক্ষে তাদের ইন্টারফেসগুলি?

যদি আপনি ফ্রেমওয়ার্কগুলির সহজতর (বা যিনি আপনার ইন্টারফেসটি কমপক্ষে অ্যাক্সেস করেন) এর চারপাশে একটি মোড়ক লিখতে থাকেন তবে সেই র‌্যাপারটি কোনও লাইব্রেরিতে সংকলন করা সম্ভব হত না? প্রদত্ত লাইব্রেরিটি প্রাকম্পাইল এবং কেবল এটির শিরোনাম বিতরণ করা দরকার, আপনি কার্যকরভাবে অন্তর্নিহিত কাঠামোটি লুকিয়ে রাখবেন এবং সংঘাতের সাথে এটি দ্বিতীয় ফ্রেমওয়ার্কের সাথে একত্রিত করতে মুক্ত হবে।

আমি অবশ্যই প্রশংসা করি যে আপনি যখন একই সাথে উভয় ফ্রেমওয়ার্ক থেকে ক্লাস ব্যবহার করতে চান তখন অনেক সময় থাকতে পারে তবে আপনি সেই কাঠামোর আরও ক্লাস অ্যাডাপ্টারের জন্য কারখানা সরবরাহ করতে পারেন। এই বিন্দুটির পিছনে আমি অনুমান করি যে আপনি উভয় ফ্রেমওয়ার্ক থেকে যে ইন্টারফেসগুলি ব্যবহার করছেন তা বের করার জন্য আপনার কিছুটা রিফ্যাক্টরিং প্রয়োজন যা আপনার মোড়ক তৈরির জন্য আপনার জন্য একটি সূচনা পয়েন্ট দেবে।

আপনি এবং আপনি যখন মোড়ানো গ্রন্থাগার থেকে আরও কার্যকারিতা প্রয়োজন লাইব্রেরি উপর তৈরি করতে পারে, এবং যখন আপনি পরিবর্তন এটি কেবল পুনরায় কম্পাইল।

আবার কোনওভাবেই প্রমাণিত না হলেও দৃষ্টিকোণ যুক্ত করার মতো মনে হয়েছে। আশা করি এটা সাহায্য করবে :)


-1

যদি আপনার দুটি ফ্রেমওয়ার্ক থাকে তবে একই ফাংশনটির নাম রয়েছে, আপনি ফ্রেমওয়ার্কগুলি গতিশীলভাবে লোড করার চেষ্টা করতে পারেন। এটি অবহেলিত, তবে সম্ভব হবে। ওজেক্টিভ-সি ক্লাস দিয়ে এটি কীভাবে করবেন, আমি জানি না। আমি অনুমান করছি NSBundleক্লাসে এমন পদ্ধতি থাকবে যা একটি নির্দিষ্ট ক্লাস লোড করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.