আইবিআউটলেটগুলি কি এআরসি-র অধীনে শক্তিশালী বা দুর্বল হওয়া উচিত?


551

আমি আরসি ব্যবহার করে আইওএস 5 এর জন্য একচেটিয়াভাবে বিকাশ করছি। উচিত IBOutletকাছে গুলি UIViewগুলি (এবং উপশ্রেণী) হতে strongবা weak?

অনুসরণ:

@property (nonatomic, weak) IBOutlet UIButton *button;

এই সমস্ত থেকে মুক্তি পাবেন:

- (void)viewDidUnload
{
    // ...
    self.button = nil;
    // ...
}

এটি করতে কোনও সমস্যা আছে? strong'ইন্টারফেস বিল্ডার' সম্পাদক থেকে সরাসরি শিরোনামের সাথে সংযোগ করার সময় টেমপ্লেটগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন উত্পন্ন বৈশিষ্ট্যগুলি ব্যবহার করছে তবে কেন? UIViewControllerইতিমধ্যে একটি রয়েছে strongতার রেফারেন্স viewযা তার subviews অপরিবর্তিত।


11
একটি নোট হিসাবে, IBOutletCollection()অবশ্যই হবে না weak, অন্যথায় এটি হিসাবে ফিরে আসে nil
ওহহ

ইন্টারফেস বিল্ডারের মাধ্যমে আইবিআউটলেট তৈরি করার সময় এক্সকোড 8.2.1 দুর্বল ব্যবহার করে। তবে এখানে অনেক উত্তর শক্তিশালী ব্যবহার করার পরামর্শ দেয়।
নিউনি

1
@neoneye আমি শুধু Xcode 8.3.2 স্টোরিবোর্ড থেকে দ্রুতগতি ফাইলে টেনে দিয়ে এবং এটি ডিফল্টে চেষ্টাstrong
CupawnTae

উত্তর:


252

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

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

আমি টুইটারে আইবি দলের একজন ইঞ্জিনিয়ারের কাছে এ সম্পর্কে জিজ্ঞাসা করেছি এবং তিনি নিশ্চিত করেছেন যে শক্তিশালী ডিফল্ট হওয়া উচিত এবং বিকাশকারী ডকস আপডেট করা হচ্ছে।

https://twitter.com/_danielhall/status/620716996326350848 https://twitter.com/_danielhall/status/620717252216623104


33
এটি কি সত্যিই সত্য বা 300+ উত্তরটি সঠিকটির সাথে জড়িত? আমি লক্ষ্য করেছি যে ইন্টারফেসবিল্ডার ডিফল্টরূপে দুর্বল ব্যবহার করেন যখন আপনি
স্ট্রিটবোর্ড থেকে .h-

4
400+ ভোট সহ একটি সঠিক, তবে পুরানো। যেহেতু আইওএস 6 ভিউডিডঅনলোড কল হয় না, সুতরাং দুর্বল আউটলেটগুলি থাকার কোনও সুবিধা নেই।
kjam

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

5
আমাকে আপনার সাথে একমত না। 'আপনি যা তৈরি করেন নি তার দৃ a় রেফারেন্স ধরে রাখা' উদ্দেশ্য-সিতে সর্বদা ঘটে। এজন্য এখানে রেফারেন্স গণনা রয়েছে , তারপরে একক মালিক। এই প্রস্তাবটি ব্যাক আপ করার জন্য আপনার কি কোনও রেফারেন্স রয়েছে? আপনি দুর্বল আউটলেটগুলির অন্যান্য সুবিধাগুলি তালিকা করতে পারেন?
kjam


450

সতর্কতা, উত্তরের উত্তর : ডাব্লুডাব্লুডিসি 2015 অনুসারে এই উত্তরটি আপ টু ডেট নয়, সঠিক উত্তরের জন্য উপরের গৃহীত উত্তর (ড্যানিয়েল হল) দেখুন to এই উত্তরটি রেকর্ডের জন্য থাকবে।


বিকাশকারী লাইব্রেরি থেকে সংক্ষিপ্তসার :

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

  • আপনি যে আউটলেটগুলিতে তৈরি করেন, উদাহরণস্বরূপ, কোনও ভিউ কন্ট্রোলারের ভিউ বা উইন্ডো নিয়ামকের উইন্ডোর সাবভিউগুলি হ'ল মালিকানা বোঝায় না এমন বস্তুর মধ্যে স্বেচ্ছাসেবী রেফারেন্স।

  • শক্তিশালী আউটলেটগুলি প্রায়শই ফ্রেমওয়ার্ক ক্লাস দ্বারা নির্দিষ্ট করা হয় (উদাহরণস্বরূপ, ইউআইভিউকন্ট্রোলারের ভিউ আউটলেট, বা এনএসওয়াইন্ডো কনট্রোলারের উইন্ডো আউটলেট)।

    @property (weak) IBOutlet MyView *viewContainerSubview;
    @property (strong) IBOutlet MyOtherClass *topLevelObject;

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

68
আমি লিঙ্কটি বাম দিকের নেভিগেশন ফলকটি থেকে অনুলিপি করেছি। : ডি
অ্যালেক্সান্ডার একার্স 18

27
"ফাইলের মালিক থেকে নীব ফাইলের শীর্ষ স্তরের অবজেক্টগুলি (বা, আইওএস-এ, একটি স্টোরিবোর্ডের দৃশ্য)" অর্থ কী?
ভান ডু ট্রান

16
@ ভানডুট্রান - এর অর্থ এনআইবিতে থাকা মূল উপাদানগুলিতে থাকা অবজেক্টগুলি, অর্থাত আপনি সেখানে অন্য দৃষ্টিভঙ্গি ইনস্ট্যান্ট করেছেন যা মূল দৃষ্টিভঙ্গির সরাসরি সংক্ষিপ্তসার নয়, তারপরে এর একটি শক্তিশালী রেফারেন্স থাকা দরকার।
ম্যাটজগ্লোলোয়

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

50

যদিও ডকুমেন্টেশনটি weakসাবভিউগুলির জন্য বৈশিষ্ট্যগুলিতে ব্যবহার করার পরামর্শ দিচ্ছে, আইওএস 6 এর পরিবর্তে এটির strongপরিবর্তে ডিফল্ট মালিকানার যোগ্যতাটি ব্যবহার করা ভাল বলে মনে হচ্ছে । এই UIViewControllerমতামতগুলির পরিবর্তনের কারণে এটি আর লোড হয় না।

  • আইওএস Before এর আগে, আপনি যদি নিয়ামকের দৃশ্যের সাবউভিউগুলির শক্তিশালী লিঙ্কগুলি চারপাশে রাখেন, যদি ভিউ কন্ট্রোলারের মূল দৃষ্টিভঙ্গিটি লোড হয়ে যায়, ততক্ষণ ভিউ কন্ট্রোলার যতক্ষণ না কাছাকাছি থাকে সেগুলি সাবউভিউগুলিতে ধরে রাখে।
  • আইওএস 6-এর পরে, ভিউগুলি আর লোড করা হবে না, তবে একবারে লোড করা হবে এবং তার নিয়ামক যতক্ষণ না থাকে ততক্ষণ স্থির থাকে। এত শক্তিশালী সম্পত্তি কোন ব্যাপার না। তারা শক্তিশালী রেফারেন্স চক্র তৈরি করবে না, যেহেতু তারা শক্তিশালী রেফারেন্স গ্রাফটি নির্দেশ করে।

বলেছিল, আমি ব্যবহারের মধ্যে ছিঁড়ে গিয়েছি

@property (nonatomic, weak) IBOutlet UIButton *button;

এবং

@property (nonatomic) IBOutlet UIButton *button;

আইওএস 6 এবং এর পরে:

  • ব্যবহার করে weakস্পষ্টভাবে বলা হয়েছে যে নিয়ামক বোতামটির মালিকানা চান না।

  • তবে বাদ দেওয়া weakআইওএস 6 এ আনলোড না করে ক্ষতি করে না এবং এটি আরও খাটো। কিছু সম্ভবত এটি দ্রুতও চিহ্নিত করতে পারে তবে আমি এখনও এমন একটি অ্যাপের মুখোমুখি হইনি যা weak IBOutletএর কারণে খুব ধীর slow

  • ব্যবহার না weakকরা একটি ত্রুটি হিসাবে বিবেচিত হতে পারে।

নীচের লাইন: আইওএস 6 যেহেতু আমরা ভিউ আনলোডিং ব্যবহার না করি ততক্ষণ আমরা এই ভুলটি আর পেতে পারি না। পার্টির সময়. ;)


এটি সত্য, তবে আপনি এখনও নিজেরাই ভিউটি আনলোড করতে চাইতে পারেন। কোন ক্ষেত্রে আপনাকে নিজের সমস্ত আউটলেট nilম্যানুয়ালি সেট করতে হবে ।
হাইপারক্রিপ্ট

পিএস: weak
এআরএম in৪

এটি ঠিক আছে, আপনি যদি ভিউ আনলোডিং বাস্তবায়ন করেন তবে weakবৈশিষ্ট্য বা __weakউদাহরণের ভেরিয়েবলগুলি যাওয়ার উপায় to আমি কেবল এখানে উল্লেখ করতে চেয়েছিলাম যে এখানে ত্রুটির সম্ভাবনা কম রয়েছে। হিসাবে weakarm64 উপর সস্তা হচ্ছে, আমি এমনকি সঙ্গে একটি বাস্তব জীবনের কর্মক্ষমতা সমস্যা দেখা যায় না weak IBOutletarmv7 উপর গুলি। :)
ট্যাম্মো ফ্রিজ

সেক্ষেত্রে, strongতোলে পাশাপাশি অনুভূতি। strongআপনি যদি আনলোডিং ভিউটি ব্যবহার করেন তবেই এটি ক্ষতিকারক — তবে এই দিনগুলি কে করে? :)
ট্যাম্মো ফ্রিজ

2
@ রোকোটিলোস প্রথম আইফোনের র‍্যাম খুব সীমিত ছিল। যদি আমি সঠিকভাবে স্মরণ করি তবে সক্রিয় অ্যাপ্লিকেশনটির জন্য প্রায় 10 এমবি রেখে 128 এমবি। একটি ছোট মেমরির পদচিহ্ন হ'ল অত্যন্ত গুরুত্বপূর্ণ, তাই এখানে আনলোড লোড করা হয়েছিল। এটি এখন বদলে গেছে যেহেতু আমাদের এখন আরও বেশি পরিমাণে র‍্যাম রয়েছে এবং অ্যাপল আইওএস 6-তে ইউআইভিউউগুলি অনুকূলিত করেছে, যাতে মেমরির সতর্কতার উপর, ভিউটি লোড না করে প্রচুর মেমরি মুক্ত করা যায়।
ট্যাম্মো ফ্রিজ

34

আমি তাতে কোনও সমস্যা দেখছি না। প্রাক-এআরসি, আমি সর্বদা আমার আইবিউটলেট তৈরি করেছি assign, কারণ তারা ইতিমধ্যে তাদের তত্ত্বাবধায়কের দ্বারা বজায় রয়েছে। আপনি যদি weakএগুলি তৈরি করেন তবে আপনার চিহ্নিত হিসাবে, ভিউডিডনলোডে এগুলি নিষ্ক্রিয় করা উচিত নয়।

একটি সতর্কতামূলক: আপনি একটি এআরসি প্রকল্পে আইওএস ৪.x সমর্থন করতে পারেন, তবে আপনি যদি তা করেন তবে আপনি ব্যবহার করতে পারবেন না weak, তাই আপনাকে এগুলি তৈরি করতে হবে, সেক্ষেত্রে আপনি assignএখনও viewDidUnloadএড়াতে রেফারেন্সটি বাতিল করতে চান একটি ঝুঁকিপূর্ণ পয়েন্টার। আমি যে ঝুঁকির পয়েন্টার বাগটি ভোগ করেছি তার একটি উদাহরণ এখানে:

জিআইপি কোডের জন্য একটি ইউআইভিউকন্ট্রোলারের একটি ইউআইটিএক্সেক্সটফিল্ড রয়েছে। এটি ব্যবহারকারীর অবস্থানের জিওকোড বিপরীত করতে এবং জিপ কোডটি সেট করতে CLLocationManager ব্যবহার করে। এখানে প্রতিনিধি কলব্যাক:

-(void)locationManager:(CLLocationManager *)manager
   didUpdateToLocation:(CLLocation *)newLocation
          fromLocation:(CLLocation *)oldLocation {
    Class geocoderClass = NSClassFromString(@"CLGeocoder");
    if (geocoderClass && IsEmpty(self.zip.text)) {
        id geocoder = [[geocoderClass alloc] init];
        [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
            if (self.zip && IsEmpty(self.zip.text)) {
                self.zip.text = [[placemarks objectAtIndex:0] postalCode];
            }
        }];    
    }
    [self.locationManager stopUpdatingLocation];
}

আমি দেখতে পেলাম যে আমি যদি সঠিক সময়ে এই দৃষ্টিভঙ্গিটি বাতিল করে দিয়েছি এবং সেল্ফ.জাইপটি নিঃশব্দ না করি viewDidUnloadতবে ডেলিগেট কলব্যাক সেলফ.জিপ.টেক্সটে খারাপ অ্যাক্সেস ব্যতিক্রম ছুঁড়ে ফেলতে পারে।


4
এটি আমার বোধগম্য যে weakবৈশিষ্ট্যগুলিকে খালি করার দরকার নেই viewDidUnload। তবে কেন আউটলেট তৈরির জন্য অ্যাপলের টেম্পলেটটিতে একটি অন্তর্ভুক্ত রয়েছে [self setMySubview:nil]?
ইয়াং মায়ার

3
এমন কি আসল বিশ্বের কোনও মামলা রয়েছে যেখানে আপনার আইবিউটলেটটির জন্য শক্তিশালী / ধরে রাখা ব্যবহারের কারণে সমস্যা তৈরি করতে পারে? বা এটি কি কেবল একটি রিডান্ট্যান্ট ধরে রাখা, যার অর্থ খারাপ কোডিং শৈলী তবে আপনার কোডকে প্রভাবিত করবে না?
এনজো ট্রান

1
রিডান্ট্যান্ট ধরে রাখার মতো জিনিস আছে কি? যদি কোনও অতিরিক্ত রক্ষণাবেক্ষণ থাকে, তবে এটি যথাযথভাবে গণনা করার কারণ হবে না, এবং সুতরাং এটির ধরে রাখা গণিতে অতিরিক্ত রক্ষণাবেক্ষণের কারণ এটি হতে পারে তত দ্রুত মুক্তি দেওয়া হবে না।
karlbecker_com

25

IBOutletকর্মক্ষমতা কারণে শক্তিশালী হওয়া উচিত। দেখুন স্টোরিবোর্ড রেফারেন্স, স্ট্রং IBOutlet, প্রয়োজন iOS সিন্স ডক 9

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

id objc_storeWeak(id *object, id value);

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

void objc_destroyWeak(id * object)

তারপরে, অবজেক্টটি নিবন্ধভুক্ত করা হয়েছে এবং আপত্তি_ডেস্ট্রয় উইক আবার কল করেছে:

objc_storeWeak(id *object, nil)

একটি দুর্বল রেফারেন্সের সাথে সম্পর্কিত এই বইয়ের রক্ষণাবেক্ষণ একটি শক্তিশালী রেফারেন্স প্রকাশের চেয়ে ২-৩ গুণ বেশি সময় নিতে পারে। সুতরাং, একটি দুর্বল রেফারেন্স রানটাইমের জন্য একটি ওভারহেড প্রবর্তন করে যা আপনি কেবল আউটলেটগুলিকে শক্তিশালী হিসাবে সংজ্ঞায়িত করে এড়াতে পারেন।

এক্সকোড 7 হিসাবে, এটি প্রস্তাব দেয় strong

আপনি যদি ডাব্লুডাব্লুডিসি 2015 সেশন 407 ইন্টারফেস বিল্ডারে ইউআই ডিজাইন প্রয়োগ করে দেখেন তবে এটি প্রস্তাব দেয় ( http://asciiwwdc.com/2015/sessions/407 থেকে প্রতিলিপি )

এবং আমি সর্বশেষ বিকল্পটি উল্লেখ করতে চাই সেটি হল স্টোরেজ ধরণ যা শক্তিশালী বা দুর্বল হতে পারে।

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

আপনার কেবলমাত্র আউটলেটটিকে দুর্বল করার প্রয়োজন হলে কেবল যদি আপনার একটি কাস্টম দৃষ্টিভঙ্গি থাকে যা ভিউ হায়ারার্কির কিছু ব্যাক আপ করে এবং সাধারণভাবে এটি প্রস্তাবিত নয়।

সুতরাং আমি শক্তিশালী চয়ন করতে যাচ্ছি এবং আমি সংযোগ ক্লিক করব যা আমার আউটলেট তৈরি করবে।


1
দুর্দান্ত উত্তর যা প্রকৃত কারণ ব্যাখ্যা করে
কেন

এটি বেশ ভাল এবং সমস্তই আমি স্টোরিবোর্ডে প্রয়োগ করা অঙ্গভঙ্গি সনাক্তকারীদের থেকে ফুটো দেখেছি।
থাইবাউট নোয়া

1
আমি এই লাইন বুঝতে পারি না। "আপনার কেবলমাত্র আউটলেটটিকে দুর্বল করার প্রয়োজন হলে কেবল যদি আপনার একটি কাস্টম ভিউ থাকে যা ভিউ হায়ারার্কির কিছু ব্যাক আপ করে এবং সাধারণভাবে এটি সুপারিশ করা হয় না" " কোন উদাহরণ?
ব্যবহারকারী 1872384

আমি নির্ধারিত সময় গণনা করেছি যা দুর্বল এবং শক্তিশালী লাগে, এবং এটি ঠিক একই।
টাটি

তবে দ্রুতগতির ক্ষেত্রে এটি আরও বেশি। দুর্বল উল্লেখ দ্রুত হয়।
সেপ্টেম্বর

20

আইওএস বিকাশে এনআইবি লোডিং ম্যাক বিকাশের থেকে কিছুটা আলাদা।

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

ইউআইভিউকন্ট্রোলার শক্তিশালী উল্লেখগুলি ব্যবহার করে আউটলেটগুলি সেট করতে কী মান কোডিং ব্যবহার করে use সুতরাং আপনি যখন আপনার ইউআইভিউকন্ট্রোলারকে ডেলোক করেন, শীর্ষ দৃশ্যটি স্বয়ংক্রিয়ভাবে deallocated হয়ে যায়, তবে আপনাকে অবশ্যই dealloc পদ্ধতিতে এর সমস্ত আউটলেটগুলি deallocates করতে হবে।

বিগ Nerd রাঞ্চ থেকে এই পোস্টে , তারা এই বিষয়টি কভার করে এবং এছাড়াও আইবিআউটলে একটি শক্তিশালী রেফারেন্স ব্যবহার করা ভাল পছন্দ নয় (এটি এই ক্ষেত্রে অ্যাপল দ্বারা প্রস্তাবিত হলেও) explain


16
এটি এটি ২০০৯-এর মতো ব্যাখ্যা করে AR
ডেফিড উইলিয়ামস

1
:( বিগ Nerd রাঞ্চ লিঙ্কটি মারা গেছে ... তবুও আমার সত্যিই এটি পড়ার দরকার আছে that পোস্ট সম্পর্কে যে কেউ আরও বিশদ জানে, তাই আমি এটি খুঁজে পেতে পারি?
মোটি শ্নের

@ মোটিশিশর চিন্তা করবেন না, লিংকটি এআরসি-র আগে প্রায় সময় ছিল এবং এটি আর প্রাসঙ্গিক নয় big
সের্গে গ্রিসচিভ

18

আমি এখানে একটি বিষয় উল্লেখ করতে চাই এবং তা হ'ল অ্যাপল প্রকৌশলীরা তাদের নিজস্ব ডাব্লুডাব্লুডিসি 2015 ভিডিওতে যা বলেছেন তা সত্ত্বেও:

https://developer.apple.com/videos/play/wwdc2015/407/

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

এই অ্যাপল পে উদাহরণটি দুর্বল ব্যবহার করেছে: https://developer.apple.com/library/ios/samplecode/Emporium/Listings/Emporium_ProductTableViewController_swift.html#//apple_ref/doc/uid/TP40016175-Emporium_rrodctTwlwCCrolrolIDtrtrtr

এই চিত্র-ইন-ছবির উদাহরণটি যেমন: https://developer.apple.com/library/ios/samplecode/AVFoundationPiPPlayer/Listings/AVFoundationPiPPlayer_PlayerViewController_swift.html#//apple_ref/doc/uid/Play_Play_Play_Play/Play_Play_Play_Play_Play_Play_Play_Play_Play_Play_Play_Play_Play_Play_Play_Play_Play_Play_Play_PeLPerPlayerPePerPlayer-PLPePLPerPlayRoPLPePLerationCoReration-

লিস্টারের উদাহরণটি যেমন: https://developer.apple.com/library/ios/samplecode/Lister/Listings/Lister_ListCell_swift.html#//apple_ref/doc/uid/TP40014701- তালিকা_লিস্টিলে_সুইফ্ট- ডন্টলিংক এলিমেন্টআই_57

যেমন কোর অবস্থান উদাহরণটি রয়েছে: https://developer.apple.com/library/ios/samplecode/PotLoc/Listings/Potloc_PotlocViewController_swift.html#//apple_ref/doc/uid/TP40016176- পটলোক_পলিটভিউ নিয়ন্ত্রণকারী_আপনি

হিসাবে দেখুন নিয়ামক পূর্বরূপ উদাহরণ আছে: https://developer.apple.com/library/ios/samplecode/ViewControllerPreviews/Listings/Projects_PreviewUsingDelegate_PreviewUsingDelegate_DetailViewController_swift.html#//apple_ref/doc/uid/TP40016546-Projects_PreviewUsingDelegate_PreviewUsingDelegate_DetailViewController_swift-DontLinkElementID_5

হোমকিটের উদাহরণ যেমন রয়েছে: https://developer.apple.com/library/ios/samplecode/HomeKitGlog/Listings/HMCatalog_Homes_Action_ets_ActionSetViewController_swift.html#//apple_ref/doc/uid/TP40015048_HtrgGlgs_SQLGlts/SQLClts/SQLClts/

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

পল হডসন (www.hackingwithsift.com এর লেখক) কে বিশেষ ধন্যবাদ যিনি আমাকে এই উত্তরটির জন্য ব্যাখ্যা এবং রেফারেন্স দিয়েছেন।

আমি আশা করি এটি বিষয়টিকে আরও ভালভাবে ব্যাখ্যা করেছে!

যত্ন নিবেন.


আমি এই সমস্যাটি কিছু সময়ের জন্য যাচাই করে দেখছি এবং কোনও ठोस উত্তর খুঁজে পাইনি। যেহেতু উপরের লিঙ্কটি পরামর্শ দেয় যে উভয়ই ভাল এবং সাধারণভাবে এক্সকোড অটোসোজেটসের সাথে চলে।
subin272

9

ডাব্লুডাব্লুডিসি 2015 থেকে ইন্টারফেস বিল্ডারে ইউআই ডিজাইন প্রয়োগের উপর একটি অধিবেশন রয়েছে । 32 মিন চিহ্নের চারপাশে তিনি বলেছিলেন যে আপনি সর্বদা আপনার @IBOutlet শক্তিশালী করতে চান ।


মজাদার. আমার ধারণা, যখন আনলোডিং সরানো হয়েছিল তখন এটি পরিবর্তন হয়েছিল?
হাইপারক্রিপ্ট


5

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

  • সাধারনত আউটলেট সংযোগগুলি শক্তিশালী হওয়া উচিত বিশেষত যদি আমরা এমন একটি সাবউভি বা সংযোগ সংযোগ করি যা সবসময় ভিউ রক্রমের দ্বারা বজায় থাকে না connect

  • কাস্টম ভিউগুলি তৈরি করার সময় দুর্বল আউটলেট সংযোগের প্রয়োজন হতে পারে যা ভিউ হায়ারার্কিতে কিছু ব্যাক আপ করার জন্য কিছু রেফারেন্স রয়েছে এবং সাধারণভাবে এটি প্রস্তাবিত নয়

অন্যান্য ওয়ার্ডগুলিতে এটি এখন সর্বদা শক্তিশালী হওয়া উচিত যতক্ষণ না আমাদের কিছু কাস্টম ভিউ ভিউ রাইন্ডার্কিতে কিছু ভিউ দিয়ে একটি বজায় রাখা চক্র তৈরি করে না

সম্পাদনা:

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


4

আমি মনে করি যে সর্বাধিক গুরুত্বপূর্ণ তথ্য হ'ল xib এর উপাদানগুলি স্বয়ংক্রিয়ভাবে দর্শনরূপে থাকে। সাবভিউগুলি হ'ল এনএসএর্রে। এনএসআর্রে এর উপাদানগুলির মালিকানা রয়েছে। ইত্যাদি তাদের দৃ strong় পয়েন্টার আছে। সুতরাং বেশিরভাগ ক্ষেত্রে আপনি আর একটি শক্তিশালী পয়েন্টার (আইবিআউটলেট) তৈরি করতে চান না

এবং এআরসি দিয়ে আপনাকে কিছু করার দরকার নেই viewDidUnload

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