উত্তর:
উদ্দেশ্য-সিতে বৈশিষ্ট্যের একটি নির্দিষ্ট অর্থ রয়েছে তবে আমি মনে করি যে আপনি এমন কিছু বোঝাচ্ছেন যা একটি স্ট্যাটিক ভেরিয়েবলের সমতুল্য? যেমন ফু সব ধরণের জন্য শুধুমাত্র একটি উদাহরণ?
অবজেক্টিভ-সি-তে শ্রেণীর কার্যাবলী ঘোষণা করতে আপনি এর পরিবর্তে + উপসর্গটি ব্যবহার করেন - সুতরাং আপনার প্রয়োগটি এমন কিছু দেখাচ্ছে:
// Foo.h
@interface Foo {
}
+ (NSDictionary *)dictionary;
// Foo.m
+ (NSDictionary *)dictionary {
static NSDictionary *fooDict = nil;
if (fooDict == nil) {
// create dict
}
return fooDict;
}
.
-Accessor সিনট্যাক্স উদ্দেশ্য সি এ সম্পত্তি বাঁধা নয়, এটা শুধু একটা কম্পাইল-ইন শর্টকাট কোনো পদ্ধতির জন্য যে কোনো args গ্রহণ ছাড়াই আয় কিছু। এই ক্ষেত্রে আমি এটি পছন্দ করবো- .
ক্লায়েন্ট কোডটি কোনও কিছু পেতে চায়, কোনও ক্রিয়া সম্পাদন করে না (এমনকি বাস্তবায়ন কোডটি একবারে কিছু তৈরি করতে পারে বা পার্শ্ব-প্রতিক্রিয়া ক্রিয়াকলাপ সম্পাদন করে) এমন কোনও ব্যবহারের জন্য আমি ব্যক্তিগতভাবে বাক্য গঠন পছন্দ করি । ভারী ব্যবহারের .
সিনট্যাক্সের ফলে আরও পঠনযোগ্য কোডও পাওয়া যায়: […]
ফেচগুলি .
পরিবর্তে সিনট্যাক্স ব্যবহার করার সময় এর উপস্থিতি অর্থের কিছু গুরুত্বপূর্ণ হয়ে ওঠে ।
আমি এই সমাধানটি ব্যবহার করছি:
@interface Model
+ (int) value;
+ (void) setValue:(int)val;
@end
@implementation Model
static int value;
+ (int) value
{ @synchronized(self) { return value; } }
+ (void) setValue:(int)val
{ @synchronized(self) { value = val; } }
@end
এবং আমি এটি সিঙ্গলটন প্যাটার্নের প্রতিস্থাপন হিসাবে অত্যন্ত দরকারী বলে মনে করি।
এটি ব্যবহার করতে, ডট স্বরলিপি দিয়ে কেবল আপনার ডেটা অ্যাক্সেস করুন:
Model.value = 1;
NSLog(@"%d = value", Model.value);
self
শ্রেণিক পদ্ধতির অভ্যন্তরের অর্থ কী?
@synchronized
?
যেমনটি ডাব্লুডাব্লুডিসি 2016 / এক্সকোড 8 তে দেখা গেছে ( এলএলভিএম অধিবেশন @ 5: 05 এ নতুন কী ) শ্রেণীর বৈশিষ্ট্যগুলি নীচে ঘোষণা করা যেতে পারে
@interface MyType : NSObject
@property (class) NSString *someString;
@end
NSLog(@"format string %@", MyType.someString);
নোট করুন যে শ্রেণীর বৈশিষ্ট্যগুলি কখনই সংশ্লেষিত হয় না
@implementation
static NSString * _someString;
+ (NSString *)someString { return _someString; }
+ (void)setSomeString:(NSString *)newString { _someString = newString; }
@end
static
পরিবর্তনশীল) এখনও ঘোষিত এবং ব্যবহার করতে হবে এবং পদ্ধতিগুলি যেমন তারা আগে ছিল তেমন স্পষ্টভাবে প্রয়োগ করা হয়েছে। ডট সিনট্যাক্স ইতিমধ্যে ইতিমধ্যে কাজ করেছে। সর্বোপরি, এটি সত্যের চেয়ে বড় চুক্তির মতো মনে হচ্ছে।
আপনি যদি শ্রেণি-স্তরের সমতুল্য সন্ধান করছেন @property
, তবে উত্তরটি "এরকম কিছুই নেই"। তবে মনে রাখবেন @property
, যাইহোক, কেবল সিনট্যাকটিক চিনি; এটি কেবল যথাযথ-নামযুক্ত অবজেক্ট পদ্ধতি তৈরি করে।
আপনি ক্লাসের পদ্ধতিগুলি তৈরি করতে চান যা স্থির ভেরিয়েবলগুলিতে অ্যাক্সেস করে যা অন্যরা যেমন বলেছে, কেবল কিছুটা আলাদা সিনট্যাক্স রয়েছে।
UIDevice.currentDevice.identifierForVendor
আমার জন্য কাজ কর.
এটি করার একটি থ্রেড নিরাপদ উপায়:
// Foo.h
@interface Foo {
}
+(NSDictionary*) dictionary;
// Foo.m
+(NSDictionary*) dictionary
{
static NSDictionary* fooDict = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
// create dict
});
return fooDict;
}
এই সম্পাদনাগুলি নিশ্চিত করে যে fooDict কেবল একবার তৈরি হয়েছিল।
অ্যাপলের ডকুমেন্টেশন থেকে : "প্রেরণ_অনস - কোনও অ্যাপ্লিকেশনটির আজীবন একবার এবং একবারে একটি ব্লক অবজেক্ট কার্যকর করে।"
Initializer element is not a compile-time constant
।
এক্সকোড 8 অবজেক্টিভ-সি এখন শ্রেণীর বৈশিষ্ট্যগুলিকে সমর্থন করে:
@interface MyClass : NSObject
@property (class, nonatomic, assign, readonly) NSUUID* identifier;
@end
যেহেতু শ্রেণীর বৈশিষ্ট্যগুলি কখনই সংশ্লেষিত হয় না আপনাকে নিজের প্রয়োগটি লিখতে হবে।
@implementation MyClass
static NSUUID*_identifier = nil;
+ (NSUUID *)identifier {
if (_identifier == nil) {
_identifier = [[NSUUID alloc] init];
}
return _identifier;
}
@end
আপনি শ্রেণীর নামের উপর সাধারণ ডট বাক্য গঠন ব্যবহার করে শ্রেণীর বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন:
MyClass.identifier;
বৈশিষ্ট্যগুলির কেবলমাত্র বস্তুগুলিতে মান থাকে, শ্রেণিগুলিতে নয়।
আপনার যদি শ্রেণীর সমস্ত বস্তুর জন্য কিছু সঞ্চয় করতে হয় তবে আপনাকে একটি বৈশ্বিক চলক ব্যবহার করতে হবে। আপনি এটি static
বাস্তবায়ন ফাইলে ঘোষণা করে আড়াল করতে পারেন ।
আপনি আপনার বস্তুর মধ্যে সুনির্দিষ্ট সম্পর্কগুলিও বিবেচনা করতে পারেন: আপনি আপনার শ্রেণীর নির্দিষ্ট কোনও অবজেক্টের সাথে মাস্টারের একটি ভূমিকাকে দায়ী করেন এবং অন্যকে অবজেক্টগুলি এই মাস্টারের সাথে যুক্ত করেন। মাস্টার একটি সাধারণ সম্পত্তি হিসাবে অভিধানটি ধারণ করবেন। আমি কোকো অ্যাপ্লিকেশনগুলিতে ভিউ হায়ারার্কির জন্য ব্যবহৃত গাছের মতো গাছের কথা ভাবি।
আরেকটি বিকল্প হ'ল একটি উত্সর্গীকৃত শ্রেণীর একটি অবজেক্ট তৈরি করা যা আপনার 'শ্রেণি' অভিধান এবং এই অভিধানের সাথে সম্পর্কিত সমস্ত সামগ্রীর একটি সেট উভয় সমন্বয়ে গঠিত। এটি NSAutoreleasePool
কোকোয়াদের মতো ।
এক্সকোড 8 থেকে শুরু করে আপনি বার্বির উত্তর অনুসারে শ্রেণীর সম্পত্তি বৈশিষ্ট্যটি ব্যবহার করতে পারেন ।
যাইহোক, বাস্তবায়নে, আপনাকে আইভারের পরিবর্তে স্থির পরিবর্তনশীল ব্যবহার করে শ্রেণীর সম্পত্তি জন্য শ্রেণি প্রাপ্ত এবং সেটার উভয়ই সংজ্ঞায়িত করতে হবে।
Sample.h
@interface Sample: NSObject
@property (class, retain) Sample *sharedSample;
@end
Sample.m
@implementation Sample
static Sample *_sharedSample;
+ ( Sample *)sharedSample {
if (_sharedSample==nil) {
[Sample setSharedSample:_sharedSample];
}
return _sharedSample;
}
+ (void)setSharedSample:(Sample *)sample {
_sharedSample = [[Sample alloc]init];
}
@end
আপনার যদি অনেকগুলি স্তরের স্তরের বৈশিষ্ট্য থাকে তবে একটি সিঙ্গলটন প্যাটার্ন ক্রমযুক্ত হতে পারে। এটার মতো কিছু:
// Foo.h
@interface Foo
+ (Foo *)singleton;
@property 1 ...
@property 2 ...
@property 3 ...
@end
এবং
// Foo.m
#import "Foo.h"
@implementation Foo
static Foo *_singleton = nil;
+ (Foo *)singleton {
if (_singleton == nil) _singleton = [[Foo alloc] init];
return _singleton;
}
@synthesize property1;
@synthesize property2;
@synthesise property3;
@end
এখন আপনার শ্রেণি-স্তরের বৈশিষ্ট্যগুলিতে অ্যাক্সেস করুন:
[Foo singleton].property1 = value;
value = [Foo singleton].property2;
dispatch_once
এখানে ব্যবহার করা বেশ সহজ হবে ।
[এই সমাধানটি সহজ করার চেষ্টা করুন] আপনি একটি সুইফ্ট শ্রেণিতে একটি স্ট্যাটিক ভেরিয়েবল তৈরি করতে পারেন তারপরে যেকোন উদ্দেশ্য-সি শ্রেণি থেকে কল করতে পারেন।