উদ্দেশ্য ও সি'তে দুর্বল এবং শক্তিশালী সম্পত্তি সেটার বৈশিষ্ট্য


94

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

@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;

প্রভাব এবং লাভ কী?

আমি শুনেছি আইওএস 4 এ দুর্বল উপলব্ধ নয় এবং আমাদের অ্যাসাইনমেন্ট ব্যবহার করা দরকার।

দুর্বল কি নির্ধারিত অনুরূপ?


উত্তর:


102

আপনার কাছে হয় কোনও নির্দিষ্ট ফাইলের জন্য আরসি চালু বা বন্ধ রয়েছে। যদি এটি চালু থাকে আপনি retain release autoreleaseইত্যাদি ব্যবহার করতে পারবেন না ... পরিবর্তে আপনি strong weakবৈশিষ্ট্যগুলির __strong __weak জন্য বা ভেরিয়েবলগুলির জন্য ব্যবহার করতে চান (ডিফল্ট ডিফল্ট)__strong )। শক্তিশালী ধরে রাখার সমতুল্য, তবে এআরসি আপনার জন্য রিলিজটি পরিচালনা করবে।

কেবলমাত্র আপনি দুর্বল ব্যবহার করতে চান, যদি আপনি ধরে রাখার চক্র এড়াতে চান তবে (যেমন পিতামাতার সন্তানকে ধরে রাখে এবং শিশু পিতামাতাকে ধরে রাখে তাই কখনও মুক্তি হয় না)।

'টোল ফ্রি গণনার জমকালো অনুষ্ঠান' অংশ (থেকে কাস্ট NSকরার CF) একটি সামান্য চতুর হয়। আপনাকে এখনও ম্যানুয়ালি পরিচালনা করতে হবে CFRelease()এবংCFRetain() সিএফ অবজেক্টের জন্য। আপনি যখন তাদের এনএস অবজেক্টে ফেরত রূপান্তর করবেন তখন আপনাকে রক্ষণ গণনা সম্পর্কে সংকলকটি বলতে হবে যাতে এটি আপনার কাজটি জানে।

এখানে সব ।


120

পরিবর্তনশীল বৈশিষ্ট্য সম্পর্কে আমি যা জানি তা এখানে

  1. পারমাণবিক // ডিফল্ট
  2. ননোটমিক
  3. strong = برقرار // ডিফল্ট
  4. দুর্বল
  5. ধরে রাখা
  6. নির্ধারিত // ডিফল্ট
  7. অনিরাপদ_মুক্ত
  8. অনুলিপি
  9. শুধুমাত্র পাঠযোগ্য
  10. পঠন রচনা // ডিফল্ট

সুতরাং নীচে বিশদ নিবন্ধের লিঙ্কটি যেখানে আপনি উপরে উল্লিখিত সমস্ত বৈশিষ্ট্যগুলি খুঁজে পেতে পারেন যা আপনাকে অস্বীকার করবে। যারা এখানে সেরা উত্তর দেয় তাদের সকলকে অনেক ধন্যবাদ !!

আইওএসে পরিবর্তনশীল সম্পত্তি বৈশিষ্ট্য বা সংশোধক

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

উদাহরণ:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

02. দুর্বল (আইওএস 4 = অনিরাপদ_অনরীক্ষিত) - এটি বলছে "যতক্ষণ অন্য কেউ দৃ strongly়তার সাথে এটি দেখায় ততক্ষণ এটি রাখুন" - একই জিনিস হিসাবে বরাদ্দ দেওয়া হয় না, রাখা হয় না বা ছেড়ে দেওয়া হয় না - একটি "দুর্বল" রেফারেন্স এমন একটি উল্লেখ যা আপনি ধরে রাখেন না। - আমরা সাধারণত আইবিআউটলেটগুলির জন্য দুর্বল ব্যবহার করি (ইউআইভিউকন্ট্রোলারের চাইল্ডস) works এটি কাজ করে কারণ পিতা-মাতার অবজেক্টের যতক্ষণ না শিশু সন্তানের কেবলমাত্র অস্তিত্ব প্রয়োজন। - একটি দুর্বল রেফারেন্স হল এমন একটি রেফারেন্স যা কোনও আবর্জনা সংগ্রহকারী দ্বারা সংগ্রহ করা থেকে রেফারেন্স করা বস্তুকে রক্ষা করে না। - দুর্বল মূলত বরাদ্দ করা হয়, একটি অনাদায়ী সম্পত্তি। অবজেক্টটি যখন deallocated হয় বাদে দুর্বল পয়েন্টারটি স্বয়ংক্রিয়ভাবে শূন্য হয় set

উদাহরণ:

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

@synthesize myButton;

ব্যাখ্যা : বিজে হোমারের কাছে ধন্যবাদ

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


4
প্রাথমিক তালিকায় আমি "ডিফল্ট" বলতে কী বোঝাতে চাই তা সত্যই আমি নিশ্চিত নই। আপনি উভয় আছে strong=retainএবং assignঅক্ষমতা হিসাবে লেবেল, কিন্তু এটা উভয় হতে পারে না।
স্লিপ ডি থম্পসন

27
জাল তুলনা কুকুর উপভোগ। এটি বেশ ভালভাবে ব্যাখ্যা করে।
জ্যারেট বার্নেট

4
ভাল ব্যাখ্যা, যদিও আইওএস আবর্জনা সংগ্রহ ব্যবহার করে না। এআরসি! = আবর্জনা সংগ্রহ (!), এগুলি বিভিন্ন প্রযুক্তি।

4
দুর্বল এবং অনিরাপদ_যুক্ত না হওয়া পৃথক (প্রথমটি দুর্বল রেফারেন্সগুলিকে শূন্যে ব্যবহার করে, তবে পরবর্তীটি স্কোয়াট করে)
wcochran

4
আমি কেবল আইওএস শিখছি, তবে মনে হচ্ছে আপনি weakএবং strongআপনার উদাহরণগুলিতে ভুল স্থান দিয়েছেন । এটি কী আরও বোঝাতে পারবে না যে কোনও পিতা-মাতার strongতার সন্তানের সাথে রেফারেন্স রয়েছে ( আপনি myButtonযে UIViewControllerশ্রেণীর সম্পত্তি হিসাবে দেখিয়েছেন তার সম্পত্তি হিসাবে weak) এবং শিশুরা weakতাদের পিতামাতার কাছে রেফারেন্স রাখে (যেমন viewControllerএকটি শিশু শ্রেণির সম্পত্তি হিসাবে আপনি ' পরিবর্তে সেট করা আছে strong)। উদাহরণস্বরূপ, ম্যাট নিউবুর্গের পড়া iOS 7 Programming Fundamentalsতিনি দেখায় যে একটি শ্রেণি তার প্রতিনিধিকে সম্পত্তি হিসাবে ঘোষণা করে তা দুর্বল রাখবে that এটিকে ন্যায্য বলে মনে হচ্ছে।
বোগদান আলেকজান্দ্রু

2

রবার্ট দ্বারা উল্লিখিত দস্তাবেজের সেই অংশগুলি কল করতে যা আপনার শেষ দুটি প্রশ্নের স্পষ্টভাবে উত্তর দেয়:

// The following declaration is similar to "@property(assign) MyClass *myObject;"
// except that if the MyClass instance is deallocated,
// the property value is set to nil instead of remaining as a dangling pointer.
@property(weak) MyClass *myObject;

এটি একটি শূণ্য দুর্বল রেফারেন্স হিসাবে উল্লেখ করা হয়। আপনি দুর্বল রেফারেন্স তৈরি করতে পারেন যা __unsafe_unretained ব্যবহার করে দুর্বল রেফারেন্সগুলি শূন্য করছেন না, তবে নামটি থেকে বোঝা যায়, সাধারণত এটি প্রস্তাবিত নয়।

ডক্সেও:

Weak references are not supported in Mac OS X v10.6 and iOS 4.

4
হ্যাঁ এটি সঠিক, __unsafe_unretainedএর এআরসি সংস্করণ assign
রবার্ট

2

নীচে সপ্তাহে সম্পত্তির স্ফটিক স্বচ্ছ ব্যবহার:

Any control whose properties we need to change(eg:text of a label) is declared weak and as below:

@property(nonatomic,weak) IBOutlet Type *name;
Eg: @property(nonatomic,weak) IBOutlet UILabel *myLabel;

4
আমার বৈশিষ্ট্যগুলিতে দুর্বল ব্যবহার করে, আমি একটি সতর্কতা পেয়েছি: "দুর্বল রিসিভারটি অনির্দেশ্যভাবে বাতিল করতে পারে"। আমি আরও কিছু পোস্ট দেখেছি যা এই সতর্কতাটি রোধ করতে আপনাকে একটি স্থানীয় শক্তিশালী রেফারেন্স তৈরি করতে হবে। এবং যদি এটি সত্য হয় তবে কোনও সম্পত্তিকে দুর্বল করার বিন্দুটি কী, শেষে যদি আমাকে দৃ a় রেফারেন্স তৈরি করতে হয়?
আরহ

0

আরও বিস্তৃত করার জন্য একটি উদাহরণ নেওয়া যাক (উপরের উত্তরটি ইতিমধ্যে দুর্দান্ত), এই উদাহরণটি আরও কিছুটা সহায়তা করতে পারে

আমাদের দুটি এবং A ক্লাস করা যাক

//A.h

#import <Foundation/Foundation.h>
#import "B.h"

@interface A : NSObject

@property (nonatomic, strong) B *objB;

@end

@implementation A
//

@end

//B.h

    #import <Foundation/Foundation.h>
    #import "A.h"


    @interface B : NSObject

    @property strong text(nonatomic, strong) A *objA;

    @end

    @implementation B
    //

    @end

    and in main

    #import "B.h"
    #import "A.h"

    {
    A *obja =[[A alloc]init];
    B *objb =[[B alloc]init];
    A.objB=objb;
    B.objA=obja;
   }

উপরের কোডটি ধরে রাখার চক্র তৈরি করবে কারণ উভয়ই শক্তিশালী প্রকার a --------> খ ---------> এ

সুতরাং এটি এড়াতে আপনাকে এর মধ্যে একটির সপ্তাহের সম্পত্তি ব্যবহার করতে হবে যাতে এটি সাপ্তাহিকভাবে অবজেক্টটি উল্লেখ করে এবং এটির রেফারেন্স গণনা বৃদ্ধি না করে।

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