ঘোষিত বৈশিষ্ট্যগুলিতে কি একটি সম্পর্কিত দৃষ্টান্তের পরিবর্তনশীল প্রয়োজন?


101

অবজেক্টিভ-সি ২.০ এর বৈশিষ্ট্যগুলিতে কি একটি সম্পর্কিত দৃষ্টান্তের পরিবর্তনশীল ঘোষণার প্রয়োজন? উদাহরণস্বরূপ, আমি এই জাতীয় কিছু করতে অভ্যস্ত:

MyObject.h

@interface MyObject : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end

MyObject.m

@implementation
@synthesize name;
@end

তবে, আমি যদি এর পরিবর্তে এটি করি তবে:

MyObject.h

@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end

এটি কি এখনও বৈধ? এবং এটি কোনওভাবেই আমার আগের উদাহরণ থেকে আলাদা?


দ্বিতীয় 'মাইবজেক্ট.এম' সাহসী কেন 'মাইবজেক্ট.এম' নয়?
রোমহায়ার

উত্তর:


93

আপনি আধুনিক উদ্দেশ্য সি রানটাইম ব্যবহার করে থাকেন (যে এর পারেন আইওএস 3.x বা তার অধিক, অথবা 64-বিট স্নো চিতাবাঘ বা আরো বড়) তারপর আপনি কি না এই রকম ক্ষেত্রে আপনার বিশিষ্টতার জন্য ivars সংজ্ঞায়িত করা প্রয়োজন।

যখন আপনি @synthesizeসম্পত্তি, আইভার কার্যকরভাবে আপনার জন্য সংশ্লেষিত করা হবে। এটি "ভঙ্গুর-আইভার" দৃশ্যের আশেপাশে আসে। আপনি প্রেমের সাথে কোকোতে এটি সম্পর্কে আরও পড়তে পারেন


71

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

আপনি নিজের নির্দিষ্ট করে স্বয়ংক্রিয় কোডিং গেটর / সেটারকে সর্বদা ওভাররাইড করতে পারেন। managedObjectContextঅলসভাবে বোঝায় এমন সম্পত্তি দিয়ে এটি করা হয় with সুতরাং, আপনি আপনার managedObjectContextসম্পত্তি হিসাবে ঘোষণা , কিন্তু তারপর একটি লিখুন-(NSManagedObjectContext *)managedObjectContext পদ্ধতি । মনে রাখবেন যে একটি পদ্ধতি, যা উদাহরণ ভেরিয়েবল / সম্পত্তি হিসাবে একই নাম, এটি "গেটর" পদ্ধতি।

@propertyঘোষণা পদ্ধতি এছাড়াও আপনি যেমন অন্যান্য অপশন, পারবেন retainএবং readonlyযা উদাহরণস্বরূপ পরিবর্তনশীল ঘোষণা পদ্ধতি না। মূলত, ivarএটি পুরানো উপায় এবং @propertyএটি প্রসারিত করে এবং এটি ফ্যানসিয়ার / সহজ করে তোলে। আপনি স্ব ব্যবহার করে হয় উল্লেখ করতে পারেন। উপসর্গ, বা না, নামটি যতক্ষণ না সেই শ্রেণীর কাছে অনন্য ততক্ষণ তা বিবেচনা করে না। অন্যথায়, যদি আপনার সুপারক্লাসের কোনও সম্পত্তির একই নাম থাকে তবে আপনি কোন নামটির বিষয়ে কথা বলছেন তা নির্দিষ্ট করতে আপনাকে নিজের নাম বা সুপার.নামের মতো বলতে হবে।

সুতরাং, আপনি কম এবং কম সংখ্যক লোককে ivarধনুর্বন্ধনীগুলির মধ্যে গুলি ঘোষণা করতে দেখবেন এবং পরিবর্তে কেবল নির্দিষ্টকরণের দিকে ঝুঁকছেন @propertyএবং তারপরে করছেন @synthesize। আপনি @synthesizeকোনও সম্পর্কিত ছাড়া আপনার প্রয়োগে করতে পারবেন না @property@propertyস্পেসিফিকেশন থেকে এটি কী ধরণের বৈশিষ্ট্যযুক্ত তা কেবল সিন্থেসাইজারই জানে । সংশ্লেষ বিবৃতি আপনাকে বৈশিষ্ট্যগুলির নাম পরিবর্তন করতেও সহায়তা করে, যাতে আপনি আপনার কোডের অভ্যন্তরে একটি নাম (শর্টহ্যান্ড) দ্বারা কোনও সম্পত্তি উল্লেখ করতে পারেন, তবে .h ফাইলে সম্পূর্ণ নাম ব্যবহার করুন। যাইহোক, এক্সকোডের যে দুর্দান্ত শীতল স্বয়ংক্রিয়তা রয়েছে এখন এটির কোনও সুবিধা কম নয়, তবে এখনও রয়েছে।

আশা করি এটি এর চারপাশে ভাসমান সমস্ত বিভ্রান্তি এবং ভুল তথ্য পরিষ্কার করতে সহায়তা করে।


এখন একটি দিন @ সংশ্লেষ লিখতে বাধ্যতামূলক নয় .সেই ক্ষেত্রে এই উত্তরটি কীভাবে বৈধ!
raaz

আপনি <code> @ প্রপার্টি ... @ সংশ্লেষিত </ কোড> ঘোষণা করার দরকার নেই। সিনথেসাইজ ব্যবহার আপনাকে বাস্তবায়নের ক্ষেত্রে গেটর / সেটার লিখতে সহায়তা করে। যদি আপনি সংশ্লেষিত না করেন তবে আপনাকে অবশ্যই নিজের গেটার / সেটারটি রোল করতে হবে
গেটার সেটারটি পাপাস্মার্ফ

2
@ পপাসম্মারফ এটি ভুল। আপনি সেগুলি ব্যবহার করতে পারেন @propertyএবং ব্যবহার করতে পারবেন না@synthesize এবং সেগুলি নিজে প্রয়োগ করবেন না। সংকলকটি স্বয়ংক্রিয়ভাবে synthesizeআপনাকে লিখবে না write
jbrennan

8

এটি উভয় উপায়েই কাজ করে তবে আপনি যদি কোঁকড়ানো ধনুর্বন্ধনীগুলিতে তাদের ঘোষণা না করেন, আপনি এক্সকোডে ডিবাগারে তাদের মানগুলি দেখতে পাবেন না।


3

ডকুমেন্টেশন থেকে:

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

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


3

আপনি যদি XCode 4.4 ব্যবহার করেন বা তারপরে এটি আপনার জন্য উদাহরণ ভেরিয়েবল সিন্থাইজিং কোড উত্পন্ন করবে।

আপনাকে কেবল নীচের মতো বৈশিষ্ট্যগুলি ঘোষণা করতে হবে; এটি আপনার জন্য সংশ্লেষক কোড এবং উদাহরণ ভেরিয়েবল ডিক্লারিং কোড উত্পন্ন করবে।

@property (nonatomic, strong) NSString *name;

এটি হিসাবে সংশ্লেষিত কোড উত্পন্ন করবে

@synthesize name = _name;

এবং আপনি _name ব্যবহার করে উদাহরণ পরিবর্তনযোগ্য অ্যাক্সেস করতে পারেন এটি ঘোষণার মতো

NSString* _name

তবে আপনি যদি কেবল পঠনযোগ্য সম্পত্তি এটির মতো ঘোষণা করেন

@property (nonatomic, strong, readonly) NSString *name;

এটি কোড উত্পন্ন করবে

@synthesize name;

অথবা

@synthesize name = name; 

সুতরাং আপনার নিজের সিনথেসাইজিং কোডটি যেভাবেই লিখতে পারেন তারপরে প্রিফিক্স "_" সহ তাত্ক্ষণিক পরিবর্তনশীল নামটি অ্যাক্সেস করা উচিত তবে সংকলকটি আপনার জন্য কোড উত্পন্ন করবে। তুমি লিখতে পারো

@synthesize name = _name;

1

উদ্দেশ্য-সি প্রোগ্রামিং ভাষা: সম্পত্তি বাস্তবায়ন নির্দেশিকা

অ্যাক্সেসর সংশ্লেষণের আচরণের মধ্যে পার্থক্য রয়েছে যা রানটাইমের উপর নির্ভর করে (এছাড়াও "রানটাইম পার্থক্য" দেখুন):

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

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

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