উদ্দেশ্য-সি তে শক্ত এবং দুর্বল মধ্যে পার্থক্য


308

আমি ওবজে-সি-তে নতুন, তাই আমার প্রথম প্রশ্নটি হ'ল:

strongএবং মধ্যে পার্থক্য কিweak@propertyবস্তুর প্রতি পয়েন্টার ঘোষণার মধ্যে ?

এছাড়াও, nonatomicমানে কি?


19
আসলে এটি একটি ভাল প্রশ্ন, কখনও কখনও, আমরা ভুলে গিয়েছিলাম কিভাবে শক্তিশালী / দুর্বল এবং পারমাণবিক / ননোটমিক পছন্দসমূহের প্রাথমিক ধারণাটি .... :) এ সম্পর্কে আমাদের মনে করিয়ে দেওয়ার জন্য আপনাকে ধন্যবাদ ...
andikurnia

10
@ জ্যাকিবয় হোয়াটস মজার বিষয়টি হ'ল গুগলে প্রস্তাবিত সহজ অনুসন্ধান আমাকে এখানে লিওল করে। #circularreferences
জেসন রেনাল্ডো

10
আমি গুগলে উত্তরগুলির অনেকের উপর বিশ্বাস রাখতে চাই না তবে বুদ্ধিমান উত্তরের জন্য সর্বদা
এসওকে

উত্তর:


641

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

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

  1. প্রতিনিধি সম্পত্তি, যা প্রায়শই ধরে রাখা চক্র এড়ানোর জন্য দুর্বলভাবে উল্লেখ করা হয়, এবং

  2. কোনও দৃশ্যের নিয়ামকের মূল দৃশ্যের সাবভিউ / নিয়ন্ত্রণগুলি কারণ সেই মতামতগুলি ইতিমধ্যে দৃ view়ভাবে মূল দৃশ্যের দ্বারা ধারণ করে।

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


28
@ বোর্ন: এটি থ্রেড সুরক্ষার দ্বারা আপনি কী বোঝাতে চাইছেন তার উপর নির্ভর করে। atomicগ্যারান্টি দেয় যে সম্পত্তি একই সাথে বেশ কয়েকটি থ্রেড থেকে নিরাপদে পড়া এবং লেখা যেতে পারে। এর অর্থ এই নয় যে এমন কোনও বস্তুর যার বৈশিষ্ট্যগুলি atomicস্বয়ংক্রিয়ভাবে থ্রেড-নিরাপদ।
ওলে বেগম্যান

3
দুর্দান্ত বিবরণ। আমি মনে করি এখনও অবধি সত্যিই এটি পেলাম না। ধন্যবাদ.
আহমেদালকফ

1
আপেলের ডকুমেন্টেশন অনুসারে, পারমাণবিক এবং ননোটমিক থ্রেড সুরক্ষার সমার্থক হওয়া উচিত। বিকাশকারী.অ্যাপল.
com/লিবারি

5
"দ্রষ্টব্য: সম্পত্তির পারমাণবিকতা কোনও সামগ্রীর থ্রেড সুরক্ষার সমার্থক নয়" " বিকাশকারী.অ্যাপল.
জিএস

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

706

বেলুনগুলির ক্ষেত্রে শক্তিশালী এবং দুর্বল উল্লেখগুলি সম্পর্কে ভাবতে সহায়ক হতে পারে।

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

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

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


68
+2 (কেবল যদি আমি পারতাম)। সিরিয়াসলি, সত্যই সৃজনশীল ব্যাখ্যা!
কন আন্তোনাকোস

25
আইওএস বিকাশের দেড় বছরের পরে, আমি মনে করি এখনই আমি স্পষ্টভাবে বুঝতে পেরেছি কী strongএবং weakআসলে কী বোঝায়।
ইসুরু

17
@ এক্স.লাই রিটেন চক্রটি আপনার মতো ব্যালনের কাছে দুটি স্ট্রিং রয়েছে, এর একটির মালিকানা আপনার মালিকানাধীন (সুতরাং আপনি এই ব্যালনের মালিক), অন্যটি ব্যালনের মালিকানাধীন (সুতরাং এই ব্যালন আপনার মালিকানাধীন)। যেহেতু আপনার কাছে কেবল আপনার স্ট্রিংয়ের অ্যাক্সেস রয়েছে তাই ব্যালন যেতে না চাইলে আপনি কীভাবে ব্যালনকে যেতে দেবেন? সুতরাং ব্যালন আপনার নিজের (দুর্বল) মালিক না হওয়া ভাল। আপনি যখন এটি যেতে দিতে চান, কেবল স্ট্রিংটি কেটে দিন :)
স্নেকনিই

5
তার প্রোফাইল পড়ুন, তিনি একজন আইওএস প্রশিক্ষক। খুব সৃজনশীল ব্যাখ্যা !! হ্যাটস অফ :)
হেমাং

3
পারমাণবিক বনাম অ-পরমাণু আমার মনে হয় একাধিক দরজা সহ কেন্দ্রে একটি টয়লেট সহ একটি পাবলিক টয়লেট রুম হিসাবে বর্ণনা করা যেতে পারে। কেউ একবার একটি দরজা দিয়ে টয়লেটে প্রবেশ করার পরে, তিনি যদি অবাস্তবোধের মুহুর্তটি না দেখতে চান তবে তিনি অন্য সমস্ত দরজা টয়লেটে তালাবন্ধ করে রাখতে পারেন। হাঃ হাঃ হাঃ. এই বোকা উপমা পড়ার জন্য আপনাকে ধন্যবাদ।
চেন লি ইয়ং

24

শক্তিশালী : এটিতে আগত মান নির্ধারণ করে, এটি আগত মান বজায় রাখবে এবং ইনস্ট্যান্স ভেরিয়েবলের বিদ্যমান মানটি প্রকাশ করবে

দুর্বল : এটি না ধরেই আগত মানকে এটি প্রদান করবে।

সুতরাং মূল পার্থক্যটি নতুন ভেরিয়েবলটি ধরে রাখা। সাধারণভাবে আপনি এটি ধরে রাখতে চান তবে এমন পরিস্থিতি রয়েছে যেখানে আপনি এটি রাখতে চান না অন্যথায় আপনি একটি ধরে রাখার চক্র পাবেন এবং মেমরিটি অবজেক্টগুলিকে মুক্ত করতে পারবেন না। যেমন। জেজ 1 আপত্তি ধরে রাখে 2 এবং আপজ 2 অ্যাজেক্ট 1 টি ধরে রাখে। এই ধরণের পরিস্থিতি সমাধানের জন্য আপনি দুর্বল উল্লেখগুলি ব্যবহার করেন।


12

একটি জঘন্য উত্তর: -

আমি মনে করি উপরের উত্তরে ব্যাখ্যা দেওয়া হয়েছে, সুতরাং আমি কোথায় আপনাকে ব্যবহার করতে হবে STRONGএবং কোথায় ব্যবহার করতে হবে তা আপনাকে বলছি WEAK:

এর ব্যবহার Weak: ১. প্রতিনিধি ২. আউটলেটস Sub.উইউভিউ ৪. নিয়ন্ত্রণ, ইত্যাদি

এর ব্যবহার Strong: - এর অন্তর্ভুক্ত নয় সর্বত্র অবশিষ্ট WEAK


2
এবং কী কী রয়েছে: পি
রজনী

3
WebView, mapView, ইত্যাদি
shubham মিশ্র

4
আসলে subview অধিকাংশ যে আমরা ড্র্যাগ এবং স্টোরিবোর্ড ড্রপ
shubham মিশ্র

8

শক্তিশালী এবং দুর্বল , এই কীওয়ার্ডগুলি উদ্দেশ্য-সি-তে অবজেক্ট মালিকানার চারদিকে ঘোরে

বস্তুর মালিকানা কী?

পয়েন্টার ভেরিয়েবলগুলি তারা নির্দেশ করে এমন বস্তুর মালিকানা বোঝায়।

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

যে কোনও সময় পয়েন্টার ভেরিয়েবল কোনও বস্তুর দিকে নির্দেশ করে, সেই বস্তুর মালিক থাকে এবং বেঁচে থাকবে। এটি একটি শক্তিশালী রেফারেন্স হিসাবে পরিচিত ।

একটি ভেরিয়েবল allyচ্ছিকভাবে কোনও বস্তুর মালিকানা নিতে পারে না যা এটি নির্দেশ করে। একটি ভেরিয়েবল যা কোনও জিনিসের মালিকানা নেয় না এটি দুর্বল রেফারেন্স হিসাবে পরিচিত ।

@ বিশিষ্টতা এবং বৈশিষ্ট্যগুলিকে অপ্রয়োজনীয় করে এখানে বিশদ ব্যাখ্যার জন্য একবার দেখুন


6

এখানে অ্যাপল ডকুমেন্টেশন বিভিন্ন উদাহরণ ব্যবহার করে দুর্বল এবং শক্তিশালী সম্পত্তি মধ্যে পার্থক্য ব্যাখ্যা করেছে:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

এখানে, এই ব্লগে লেখক একই জায়গায় সমস্ত সম্পত্তি সংগ্রহ করেছেন। এটি বৈশিষ্ট্যের বৈশিষ্ট্যগুলির তুলনা করতে সহায়তা করবে:

http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html


6

শক্তিশালী ডিফল্ট হয়। কোনও বস্তু যতক্ষণ না তার পক্ষে শক্ত পয়েন্টার থাকে ততক্ষণ "জীবিত" থাকে।

দুর্বল একটি রেফারেন্স নির্দিষ্ট করে যা রেফারেন্স করা বস্তুকে বাঁচিয়ে রাখে না। কোনও শক্তিশালী রেফারেন্স নিলে সেট করা থাকে যখন বস্তুর কোনও শক্তিশালী উল্লেখ নেই।


2

শক্তিশালী এবং দুর্বল রেফারেন্সটি বুঝতে নীচের উদাহরণটি বিবেচনা করুন, ধরুন আমাদের কাছে এমন পদ্ধতি রয়েছে যার নাম ডিসপ্লেলোকরিয়ালিযোগ্য able

 -(void)displayLocalVariable
  {
     UIView* myView = [[UIView alloc] init];
     NSLog(@"myView tag is = %ld", myView.tag);
  }

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

এখন যদি আমরা আমাদের ভিউ নিয়ন্ত্রকের জীবনচক্র জুড়ে মাইভিউ ভেরিয়েবলটি ধরে রাখতে চাই। এর জন্য আমরা ব্যবহারকারীর নাম হিসাবে পরিচিত সম্পত্তিটি তৈরি করতে পারি যা নীচে যেমন ভেরিয়েবল মাইভিউ (দেখুন @property(nonatomic,strong) UIView* usernameView;এবং self.usernameView = myView;নীচে কোডে) এর শক্তিশালী রেফারেন্স থাকবে ,

@interface LoginViewController ()

@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;

- (void)displayLocalVariable;

@end

@implementation LoginViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

}

-(void)viewWillAppear:(BOOL)animated
{
     [self displayLocalVariable];
}

- (void)displayLocalVariable
{
   UIView* myView = [[UIView alloc] init];
   NSLog(@"myView tag is = %ld", myView.tag);
   self.usernameView = myView;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}


@end

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

  • দুর্বল রেফারেন্স

এখন মাইনেম ভিউতে মাইনেম নিয়োগের বিষয়টি বিবেচনা করুন যা একটি দুর্বল রেফারেন্স, self.dummyNameView = myView;স্ট্রং রেফারেন্সের বিপরীতে দুর্বল কেবল মাইভিউকে ধরে রাখবেন যতক্ষণ না মাইভিউর কাছে দৃ reference় উল্লেখ নেই। দুর্বল রেফারেন্স বুঝতে নীচের কোডটি দেখুন,

-(void)displayLocalVariable
  {
     UIView* myView = [[UIView alloc] init];
     NSLog(@"myView tag is = %ld", myView.tag);
     self.dummyNameView = myView;
  }

উপরের কোডে মাইভিউয়ের প্রতি দুর্বল উল্লেখ রয়েছে (অর্থাত্ স্ব। ডামিনেমভিউতে মাইভিউয়ের প্রতি দুর্বল রেফারেন্স রয়েছে) তবে মাইভিউয়ের পক্ষে কোনও দৃ reference় রেফারেন্স নেই, অতএব স্ব.ড্মিমনাম ভিউ মাইভিউয়ের মান ধরে রাখতে সক্ষম হবে না।

এখন আবার নীচের কোডটি বিবেচনা করুন,

-(void)displayLocalVariable
      {
         UIView* myView = [[UIView alloc] init];
         NSLog(@"myView tag is = %ld", myView.tag);
         self.usernameView = myView;
         self.dummyNameView = myView;
      } 

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

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

আশাকরি এটা সাহায্য করবে.


2019-07-25 12: 33: 15.479002 + 0530 StrongAndWeak [6329: 245483] আমার নাম = এবিসি 2019-07-25 12: 33: 15.479226 + 0530 স্ট্রংঅ্যান্ডউইক [6329: 245483] আমার নামটি শক্তিশালী = এবিসি 2019- এর জন্য 07-25 12: 33: 15.479418 + 0530 StrongAndWeak [63৩২৯: 245483] আমার নামটি দুর্বল জন্য = এবিসি আপনি এতে বলেছিলেন দুর্বল সম্পত্তিটির আমার নাম নেই। তবে আমি উভয় উল্লেখের জন্য এবিসি হিসাবে আমার নামের মান পাচ্ছি .. ..? আপনি কি আরও পরিষ্কার উত্তর দিতে পারেন .... অগ্রিম ধন্যবাদ
মধু_নানী

@ রভিতেজা_দেববাল এআরসি তাৎক্ষণিকভাবে এটি করার প্রতিশ্রুতি দেয় না (অর্থাত্ "" এবিসি "স্ট্রিংটি বাতিল করুন) তবে এটি পরে নিশ্চিত হয়ে যাবে ...
মহাদেব মান্ডালে

@ রভিতেজা_দেববাল এখানে যেমন ব্যাখ্যা করুন স্ট্রিংগুলি এর জন্য একটি খারাপ উদাহরণ। আমি আমার উত্তরটি ইউআইভিউ অবজেক্টের সাথে আপডেট করেছি, আশা করি এটি সাহায্য করবে।
মহাদেব মণ্ডলে

1

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

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

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