অবজেক্টিভ-সি প্রতিনিধিদের সাধারণত সম্পত্তি ধরে রাখার পরিবর্তে বরাদ্দ দেওয়া হয় কেন?


176

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

সরাসরি স্কটের ব্লগ থেকে:

"অ্যাসাইনমেন্ট কীওয়ার্ডটি এমন একটি সেটার তৈরি করবে যা অনুলিপিটিকে অনুলিপি করা বা ধরে রাখার পরিবর্তে দৃষ্টান্তের পরিবর্তে মানটিকে সরাসরি বরাদ্দ করে N

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

কেউ কি আরও ব্যাখ্যা করতে পারে যে আমি কোথায় / কেন ভুল করছি, সুতরাং আমি অবজেক্ট-সি 2.0 প্রোগ্রামিংয়ের এই সাধারণ দৃষ্টান্তটি বুঝতে পারি প্রতিনিধিদের ধরে রাখার পরিবর্তে বরাদ্দ প্রাপ্ত সম্পত্তি ব্যবহার করার?

ধন্যবাদ!


"প্রতিনিধিদের" সাথে এবং "আইফোন" ছাড়াই পিছিয়ে।
কুইন টেলর

অনুলিপি কেন অনুলিপি পরিবর্তে বরাদ্দ করা হয় (এনএসএসস্ট্রিং এর মতো?)
ওএমজিপিওপি

উত্তর:


175

আপনি যে প্রতিনিধিদের ধরে রাখছেন তা এড়িয়ে যাওয়ার কারণটি হ'ল আপনাকে ধরে রাখার চক্র এড়ানো উচিত:

এ বি বি তৈরি করে নিজেকে বি এর প্রতিনিধি হিসাবে সেট করে ... এ এর ​​মালিক দ্বারা প্রকাশিত হয়

বি যদি এটিকে ধরে রাখে তবে এটিকে মুক্তি দেওয়া হবে না, কারণ বি এ এর ​​মালিক হিসাবে রয়েছে, সুতরাং এ এর ​​ডেলোক কখনও কল হবে না, যার ফলে এ এবং বি উভয়ই ফাঁস হয়ে গেছে।

আপনি এ যাওয়ার কথা চিন্তা করবেন না কারণ এটি বি এর মালিক এবং সুতরাং এটি ডেলোকের মধ্যে এ থেকে মুক্তি পেয়ে যায়।


আমি রাজি নই, মাইক। আমি সবেমাত্র একটি সমস্যা পেয়েছি যেখানে কোনও মডেলের কোনও প্রতিনিধি থাকে যা মডেলটি খারিজ করে দেয়। আমি যখন মডেলে কোনও স্মৃতি সতর্কতা করি তখন এটি প্রতিনিধিকে মুক্তি দেয়। তারপরে আমি যখন আমার মডেলটি খারিজ করতে যাই, তখন প্রতিনিধি শূন্য হয়। ক্র্যাশ।
পল শাপিরো

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

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

দাঁড়াও - কি weakতাই না? প্রশ্ন হল কেন ব্যবহারের assignপরিবর্তে weak?
wcochran

3
@Wcochran: না, এই প্রশ্নটি কেন তার assignপরিবর্তে ব্যবহার করা retain। প্রশ্নটি এআরসির চেয়ে পুরনো; weakএবং strong(পরবর্তীকালের সমার্থক শব্দ retain) আরসি চালু না হওয়া অবধি বিদ্যমান ছিল না। weakবনাম সম্পর্কে আপনার প্রশ্নটি assignআলাদাভাবে জিজ্ঞাসা করা উচিত ।
পিটার হোসি

44

কারণ প্রতিনিধি বার্তা প্রেরণ করার বিষয়টির প্রতিনিধিটির মালিকানা নেই।

অনেক সময়, এটি অন্য উপায়ে, যেমন কোনও নিয়ামক নিজেকে একটি ভিউ বা উইন্ডোর প্রতিনিধি হিসাবে সেট করে: নিয়ামক দর্শন / উইন্ডোর মালিক হন, সুতরাং ভিউ / উইন্ডো যদি তার প্রতিনিধিটির মালিক হয়, তবে উভয় বস্তু একে অপরের মালিক হবে। এটি অবশ্যই একটি বজায় রাখা চক্র, একই ফলাফলের সাথে ফাঁসের মতো (বস্তু যা মৃত হওয়া উচিত তা জীবিত থাকে)।

অন্যান্য সময়, অবজেক্টসটি পিয়ার হয়: একটিরও অন্যটির মালিকানা হয় না, কারণ উভয়ই একই তৃতীয় অবজেক্টের মালিকানাধীন।

যেভাবেই হোক, প্রতিনিধিটির সাথে থাকা অবজেক্টটি তার প্রতিনিধিটিকে ধরে রাখতে হবে না।

(যাইহোক, অন্তত একটি ব্যতিক্রম আছে। এটি কী ছিল তা আমার মনে নেই, এবং আমি মনে করি না এর পক্ষে কোনও ভাল কারণ ছিল))


সংযোজন (2012-05-19 যোগ হয়েছে): এআরসি এর আওতায় আপনার weakপরিবর্তে ব্যবহার করা উচিত assignnilঅবজেক্টটি মারা যাওয়ার পরে দুর্বল উল্লেখগুলি স্বয়ংক্রিয়ভাবে সেট হয়ে যায়, প্রতিনিধিত্বকারী অবজেক্টটি মৃত প্রতিনিধিকে বার্তা প্রেরণের সমাপ্তির সম্ভাবনাটি দূর করে।

যদি আপনি কোনও কারণে এআরসি থেকে দূরে থাকেন তবে কমপক্ষে assignএমন বৈশিষ্ট্যগুলি পরিবর্তন করুন unsafe_unretainedযা অবজেক্টগুলিতে নির্দেশ করে , যা স্পষ্ট করে দেয় যে এটি কোনও অবজেক্টের কাছে অপরিবর্তিত তবে অ-শূন্যের উল্লেখ।

assign এআরসি এবং এমআরসি উভয়েরই অধীন অবজেক্ট মানগুলির জন্য উপযুক্ত remains


13
NSURLConnectionতার প্রতিনিধি ধরে রাখে।

হ্যাঁ, ব্যবহার করুন weak, কিন্তু এটি মূল প্রশ্নের উত্তর দেয় না: অ্যাপল assignপরিবর্তে কেন ব্যবহার করবে weak?
wcochran

@Wcochran: আসল প্রশ্নটি ছিল "কেন ধরে রাখারassign পরিবর্তে প্রতিনিধিদের সম্পত্তি দেওয়া হয় "; এটি জিজ্ঞাসা করা হয়েছিল যখন উপস্থিত ছিল না। আপনার প্রশ্নটি আলাদা একটি, যা আপনার আলাদাভাবে জিজ্ঞাসা করা উচিত। আমি এর উত্তর দিতে খুশি হবে। weak
পিটার হোসি

@ Wcochran এবং পিটার, প্রশ্নটি অন্য কোথাও জিজ্ঞাসা করা হয়েছে?
মিঃ রজারস

17

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


"নোট করুন যে আপনার যখন দায়িত্ব অর্পিত কোনও প্রতিনিধি থাকে তখন যখনই বস্তুটি অপসারণযোগ্য হতে চলেছে তখন প্রতিনিধিটির মানটিকে সর্বদা নির্ধারণ করা খুব গুরুত্বপূর্ণ করে তোলে" কেন?
পিটার হোসে

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

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

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

1

এর পিছনে অন্যতম কারণ হ'ল চক্র ধরে রাখা। A এবং B উভয় বস্তু একে অপরের রেফারেন্স করে এবং এগুলির কোনওটিই মেমোরি থেকে মুক্তি পায় না এমন দৃশ্য কেবল এড়াতে।

প্রাথমিকভাবে এনএসআইন্টিজার এবং সিজিফ্লোয়েট বা আপনার সরাসরি মালিকানাধীন অবজেক্টগুলির যেমন ডেলিগেটগুলির জন্য অ্যাকুয়ালি অ্যাসাইনমেন্ট সেরা assign


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