আমি নীচের কোডটি দেখেছি:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
মধ্যে সম্পর্ক কি mapView
এবং mapView1
? এটি একটি set
এবং get
পদ্ধতি তৈরি করে mapView1
?
আমি নীচের কোডটি দেখেছি:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
মধ্যে সম্পর্ক কি mapView
এবং mapView1
? এটি একটি set
এবং get
পদ্ধতি তৈরি করে mapView1
?
উত্তর:
আপনার উদাহরণে, mapView1
একটি হল উদাহরণস্বরূপ পরিবর্তনশীল (ivar), মেমরি স্টোরেজ এক টুকরা যে ক্লাসে সংজ্ঞায়িত একটি দৃষ্টান্ত জন্যে example.h
এবং example.m
। mapView
একটি সম্পত্তি নাম । বৈশিষ্ট্য যে বা পড়া যায় ডট স্বরলিপি ব্যবহার করে নির্ধারণ একটি বস্তুর বৈশিষ্ট্যাবলী: myObject.mapView
। একটি সম্পত্তি নেই আছে একটি ivar উপর ভিত্তি করে করা হয়, কিন্তু অধিকাংশ সম্পত্তি। @property
ঘোষণা কেবল বিশ্বের বলে একটি সম্পত্তি বলা নেই mapView
।
@synthesize mapView = mapView1;
এই লাইনটি mapView
সংকলককে একটি সেটার এবং গেটর তৈরি করতে এবং তাদের বলা আইভারটি ব্যবহার করা উচিত mapView1
। = mapView1
অংশটি ছাড়াই , সংকলকটি ধরে নিবে যে সম্পত্তি এবং আইভারের একই নাম রয়েছে। (এই ক্ষেত্রে, এটি একটি সংকলক ত্রুটি তৈরি করবে, যেহেতু কোনও আইভার বলা হয়নি mapView
))
@synthesize
আপনি যদি এই কোডটি নিজে যুক্ত করে থাকেন তবে এই বিবৃতিটির ফলাফলের সমান:
-(MKMapView *)mapView
{
return mapView1;
}
-(void)setMapView:(MKMapView *)newMapView
{
if (newMapView != mapView1)
{
[mapView1 release];
mapView1 = [newMapView retain];
}
}
আপনি যদি ক্লাসে সেই কোডটি যুক্ত করেন তবে আপনি @synthesize
বিবৃতিটি এর সাথে প্রতিস্থাপন করতে পারেন
@dynamic mapView;
প্রধান জিনিসটি ivars এবং বৈশিষ্ট্যগুলির মধ্যে একটি খুব স্পষ্ট ধারণাগত পার্থক্য রয়েছে। এগুলি আসলে দুটি খুব ভিন্ন ধারণা।
@synthesize
ভেরিয়েবলের জন্য একটি গেটর এবং একটি সেটার তৈরি করে।
এটি আপনাকে আপনার ভেরিয়েবলের জন্য কিছু বৈশিষ্ট্য নির্দিষ্ট করতে দেয় এবং যখন আপনি ভ্যারিয়েবলের @synthesize
সেই সম্পত্তিটি আপনি ভেরিয়েবলের জন্য গেটর এবং সেটার তৈরি করেন।
সম্পত্তির নাম পরিবর্তনশীল নামের মতো হতে পারে। কখনও কখনও মানুষ এটা ভিন্ন তাই হিসাবে এটি ব্যবহার করতে হতে চান init
বা dealloc
বা প্যারামিটার একই পরিবর্তনশীল এর নাম দিয়ে পাস করা হয়েছে যখন।
ডকুমেন্টেশন থেকে :
আপনি @ সংশ্লেষিত কীওয়ার্ডটি সংকলককে জানানোর জন্য যে এটি যদি আপনি @ বাস্তবায়ন ব্লকের মধ্যে সরবরাহ না করেন তবে সম্পত্তিটির জন্য সেটার এবং / অথবা গেটর পদ্ধতিগুলি সংশ্লেষিত করা উচিত।
লিগ্যাসি কোড সম্পাদনা করার সময় আমি যখন এই সমস্যার মধ্যে পড়েছি তখন বিদ্যমান উত্তরগুলিতে অতিরিক্ত নোট তৈরি করতে চাই যার একটি সম্পর্কে আমাদের সচেতন হওয়া দরকার।
এমনকি একটি নতুন সংকলক সংস্করণ সহ এটি কখনও কখনও কিছু বাদ দেয় যদি আপনি বাদ দেন @synthesize propertyName
বা না করেন ।
ক্ষেত্রে আপনি যখন সিন্থেসাইজ করার সময় কোনও আন্ডারস্কোর ছাড়াই একটি উদাহরণ পরিবর্তনশীল ঘোষণা করেন যেমন:
শিরোলেখ:
@interface SomeClass : NSObject {
int someInt;
}
@property int someInt;
@end
বাস্তবায়ন:
@implementation SomeClass
@synthesize someInt;
@end
self.someInt
হিসাবে একই চলক অ্যাক্সেস করা হবে someInt
। Ivars জন্য একটি শীর্ষস্থানীয় আন্ডারস্কোর ব্যবহার না করা নামকরণ কনভেনশনগুলি অনুসরণ করে না তবে আমি কেবল এমন পরিস্থিতিতে এসেছি যেখানে আমাকে এই জাতীয় কোডটি পড়তে এবং সংশোধন করতে হয়েছিল।
তবে আপনি যদি এখন মনে করেন যে "আরে, @ নতুন সংকলক ব্যবহার করার কারণে @ সৃজনশীলতা আর কোনও গুরুত্বপূর্ণ নয়" আপনি ভুল! আপনার ক্লাসের ফলস্বরূপ দুটি আইভার থাকবে , যথা someInt
একটি অটোজেনারেটেড_someInt
ভেরিয়েবল। এইভাবে self.someInt
এবং someInt
আর একই ভেরিয়েবলগুলিকে আর সম্বোধন করবে না। আপনি যেমন আচরণের প্রত্যাশা না করেন যদি আমি এটি করেছিলাম তবে এটি আপনাকে কিছুটা মাথা ব্যথা পেতে পারে।
@synchronize
সম্পত্তি অ্যাক্সেস করার সময় থ্রেডগুলি কীভাবে সিঙ্ক্রোনাইজ করা যায় এবং @synthesize
এটি গেটার এবং সেটটারগুলির মাধ্যমে সম্পত্তিটিকে উদাহরণস্বরূপ পরিবর্তনশীলের সাথে সংযুক্ত করার জন্য নির্দেশিকা ।
Autosynthesized property 'someInt' will use synthesized instance variable '_someInt', not existing instance variable 'someInt'
। (
আপেল ডকুমেন্টেশন অনুসারে @ সিন্থেসাইজ কেবল ইনসার্ট ভেরিয়েবলের নাম পরিবর্তন করতে ব্যবহৃত হয়। উদাহরণ স্বরূপ
@property NSString *str;
@synthesize str = str2;
এখন ক্লাসে আপনি ব্যবহার করতে পারবেন না _str
কারণ উপরের লাইনটি উদাহরণের পরিবর্তনশীলটির নাম পরিবর্তন করেছেstr2
@property
অন্যান্য শ্রেণিতে বা অন্য কথায় অবজেক্টগুলিকে অবজেক্টগুলি ব্যবহার করার অনুমতি দেয় object
আপনি যখন @ ইন্টারফেসে কোনও সম্পত্তি তৈরি করবেন, সেই সম্পত্তিটি _propertyName নামে একটি দৃষ্টান্ত পরিবর্তনশীল দ্বারা স্বয়ংক্রিয়ভাবে ফিরে আসবে। সুতরাং আপনি যখন ফার্স্টনেম নামে একটি সম্পত্তি তৈরি করবেন তখন দৃশ্যের সংকলকটির পিছনে _firstName নামে একটি দৃষ্টান্ত পরিবর্তন হয় default সংকলক আপনার জন্য গেটর এবং সেটার পদ্ধতিও তৈরি করবে (যেমন প্রথম নাম, সেট ফার্স্টনাম)।
এখন আপনি যখন @synthesize firstName দ্বারা সম্পত্তিটি সংশ্লেষ করবেন, আপনি কেবল কম্পাইলারটি ফার্স্টনেম দ্বারা আমার ইনস্ট্যান্স ভেরিয়েবল (_ফার্সনাম) এর নাম পরিবর্তন করে বলছেন। আপনি যদি নিজের ব্যাক আপ ইন্সট্যান্ট ভেরিয়েবলের বিভিন্ন নাম দিয়ে নাম পরিবর্তন করতে চান তবে সম্পত্তির নাম সংশ্লেষ করার সময় আপনি কেবল আলাদা নাম বরাদ্দ করতে পারেন (অর্থাত্ @synthesize firstName = myFrstName), এটি করার মাধ্যমে আপনার সম্পত্তিটি আমার প্রথম নাম হিসাবে অভিহিত পরিবর্তনশীল দ্বারা ব্যাক আপ করা হবে।
সুতরাং, সংক্ষেপে, বেশিরভাগ সময় @ সায়েন্টাইজাইজ আপনার সম্পত্তি দ্বারা ব্যাক আপ করা আপনার ভেরিয়েবলটির নাম পরিবর্তন করতে ব্যবহৃত হয়।