@ সংশ্লেষ কী ঠিক কি করে?


148

আমি নীচের কোডটি দেখেছি:

//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;

//example.m
@synthesize mapView = mapView1

মধ্যে সম্পর্ক কি mapViewএবং mapView1? এটি একটি setএবং getপদ্ধতি তৈরি করে mapView1?


1
আপডেট: তবে সর্বশেষতম সরঞ্জাম সেট সহ @ সায়েন্টেসাইজ এখন (প্রায়) কখনই প্রয়োজন হয় না। অন্যান্য স্ট্যাক ওভারফ্লো প্রশ্নের উত্তর দেখুন ।
আলী বিডল

উত্তর:


228

আপনার উদাহরণে, mapView1একটি হল উদাহরণস্বরূপ পরিবর্তনশীল (ivar), মেমরি স্টোরেজ এক টুকরা যে ক্লাসে সংজ্ঞায়িত একটি দৃষ্টান্ত জন্যে example.hএবং example.mmapViewএকটি সম্পত্তি নাম । বৈশিষ্ট্য যে বা পড়া যায় ডট স্বরলিপি ব্যবহার করে নির্ধারণ একটি বস্তুর বৈশিষ্ট্যাবলী: 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 এবং বৈশিষ্ট্যগুলির মধ্যে একটি খুব স্পষ্ট ধারণাগত পার্থক্য রয়েছে। এগুলি আসলে দুটি খুব ভিন্ন ধারণা।


31

@synthesize ভেরিয়েবলের জন্য একটি গেটর এবং একটি সেটার তৈরি করে।

এটি আপনাকে আপনার ভেরিয়েবলের জন্য কিছু বৈশিষ্ট্য নির্দিষ্ট করতে দেয় এবং যখন আপনি ভ্যারিয়েবলের @synthesizeসেই সম্পত্তিটি আপনি ভেরিয়েবলের জন্য গেটর এবং সেটার তৈরি করেন।

সম্পত্তির নাম পরিবর্তনশীল নামের মতো হতে পারে। কখনও কখনও মানুষ এটা ভিন্ন তাই হিসাবে এটি ব্যবহার করতে হতে চান initবা deallocবা প্যারামিটার একই পরিবর্তনশীল এর নাম দিয়ে পাস করা হয়েছে যখন।


16

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

আপনি @ সংশ্লেষিত কীওয়ার্ডটি সংকলককে জানানোর জন্য যে এটি যদি আপনি @ বাস্তবায়ন ব্লকের মধ্যে সরবরাহ না করেন তবে সম্পত্তিটির জন্য সেটার এবং / অথবা গেটর পদ্ধতিগুলি সংশ্লেষিত করা উচিত।


8

লিগ্যাসি কোড সম্পাদনা করার সময় আমি যখন এই সমস্যার মধ্যে পড়েছি তখন বিদ্যমান উত্তরগুলিতে অতিরিক্ত নোট তৈরি করতে চাই যার একটি সম্পর্কে আমাদের সচেতন হওয়া দরকার।

এমনকি একটি নতুন সংকলক সংস্করণ সহ এটি কখনও কখনও কিছু বাদ দেয় যদি আপনি বাদ দেন @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আর একই ভেরিয়েবলগুলিকে আর সম্বোধন করবে না। আপনি যেমন আচরণের প্রত্যাশা না করেন যদি আমি এটি করেছিলাম তবে এটি আপনাকে কিছুটা মাথা ব্যথা পেতে পারে।


"সিঙ্ক্রোনাইজ"! = "সিনথেসাইজ"?
জামেশফিশার

হ্যাঁ, এগুলি 2 টি ভিন্ন ধারণা। @synchronizeসম্পত্তি অ্যাক্সেস করার সময় থ্রেডগুলি কীভাবে সিঙ্ক্রোনাইজ করা যায় এবং @synthesizeএটি গেটার এবং সেটটারগুলির মাধ্যমে সম্পত্তিটিকে উদাহরণস্বরূপ পরিবর্তনশীলের সাথে সংযুক্ত করার জন্য নির্দেশিকা ।
লার্স ব্লামবার্গ

1
জামেশফিশারের মন্তব্যটি আপনাকে সতর্ক করার জন্য হয়েছিল যে আপনি আপনার উত্তরে সিঙ্ক্রোনাইজ এবং সংশ্লেষিত করেছেন। আপনি দুটি বিনিময়যোগ্যভাবে ব্যবহার করুন।
ম্যাপেল

1
আমাকে সে সম্পর্কে সচেতন করার জন্য ধন্যবাদ! আমি সম্পূর্ণরূপে এটি পর্যবেক্ষণ করেছি, অ-বিদ্যমান @ সিংক্রোনাইজ কীওয়ার্ডটি ব্যবহার না করার জন্য উত্তরটি আপডেট করেছি।
লার্স ব্লুমবার্গ

সেক্ষেত্রে, 10 Xcode বিষয়ে সতর্ক হবে: Autosynthesized property 'someInt' will use synthesized instance variable '_someInt', not existing instance variable 'someInt'। (
এক্সকোডের

7

আপেল ডকুমেন্টেশন অনুসারে @ সিন্থেসাইজ কেবল ইনসার্ট ভেরিয়েবলের নাম পরিবর্তন করতে ব্যবহৃত হয়। উদাহরণ স্বরূপ

@property NSString *str;

@synthesize str = str2; 

এখন ক্লাসে আপনি ব্যবহার করতে পারবেন না _strকারণ উপরের লাইনটি উদাহরণের পরিবর্তনশীলটির নাম পরিবর্তন করেছেstr2

@property অন্যান্য শ্রেণিতে বা অন্য কথায় অবজেক্টগুলিকে অবজেক্টগুলি ব্যবহার করার অনুমতি দেয় object


3
স্পষ্টতই, এক্সকোড ৪.৪ দিয়ে শুরু করে, কলং ঘোষিত বৈশিষ্ট্যের স্বতঃসংশোধনের জন্য সহায়তা সরবরাহ করে। সুতরাং বেশিরভাগ ক্ষেত্রে @ সংশ্লেষের প্রয়োজন নেই। Useyourloaf.com/blog/2012/08/01/…
huyz

5

আপনি যখন @ ইন্টারফেসে কোনও সম্পত্তি তৈরি করবেন, সেই সম্পত্তিটি _propertyName নামে একটি দৃষ্টান্ত পরিবর্তনশীল দ্বারা স্বয়ংক্রিয়ভাবে ফিরে আসবে। সুতরাং আপনি যখন ফার্স্টনেম নামে একটি সম্পত্তি তৈরি করবেন তখন দৃশ্যের সংকলকটির পিছনে _firstName নামে একটি দৃষ্টান্ত পরিবর্তন হয় default সংকলক আপনার জন্য গেটর এবং সেটার পদ্ধতিও তৈরি করবে (যেমন প্রথম নাম, সেট ফার্স্টনাম)।

এখন আপনি যখন @synthesize firstName দ্বারা সম্পত্তিটি সংশ্লেষ করবেন, আপনি কেবল কম্পাইলারটি ফার্স্টনেম দ্বারা আমার ইনস্ট্যান্স ভেরিয়েবল (_ফার্সনাম) এর নাম পরিবর্তন করে বলছেন। আপনি যদি নিজের ব্যাক আপ ইন্সট্যান্ট ভেরিয়েবলের বিভিন্ন নাম দিয়ে নাম পরিবর্তন করতে চান তবে সম্পত্তির নাম সংশ্লেষ করার সময় আপনি কেবল আলাদা নাম বরাদ্দ করতে পারেন (অর্থাত্ @synthesize firstName = myFrstName), এটি করার মাধ্যমে আপনার সম্পত্তিটি আমার প্রথম নাম হিসাবে অভিহিত পরিবর্তনশীল দ্বারা ব্যাক আপ করা হবে।

সুতরাং, সংক্ষেপে, বেশিরভাগ সময় @ সায়েন্টাইজাইজ আপনার সম্পত্তি দ্বারা ব্যাক আপ করা আপনার ভেরিয়েবলটির নাম পরিবর্তন করতে ব্যবহৃত হয়।


2

দেখুন আপেল ডক্স

মূলত সংশ্লেষ একটি সেটম্যাপভিউ এবং ম্যাপভিউ পদ্ধতি তৈরি করে যা মানচিত্রভিউ 1 সেট করে এবং পায়


2

এটি আপনার বস্তুর জন্য গেটর এবং সেটার তৈরি করে। আপনি এই জাতীয় কিছু দিয়ে অ্যাক্সেস করতে পারেন:

MKMapView* m = object.mapView;

অথবা

object.mapView = someMapViewObject

ম্যাপভিউ 1 ক্লাসে আইভারের নাম, মানচিত্র ভিউ গিটার / সেটার পদ্ধতি (গুলি) এর নাম।

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