উত্তর:
আপনি কোনও পদ্ধতিই সুরক্ষিত বা ব্যক্তিগত হিসাবে ঘোষণা করতে পারবেন না । উদ্দেশ্য-সি এর গতিশীল প্রকৃতি পদ্ধতির জন্য অ্যাক্সেস নিয়ন্ত্রণগুলি প্রয়োগ করা অসম্ভব করে তোলে। (আপনি কঠোর গতির জরিমানার সময় ভারসাম্যভাবে সংকলক বা রানটাইম সংশোধন করে এটি করতে পারেন, তবে স্পষ্ট কারণেই এটি করা হয়নি))
উত্স থেকে নেওয়া ।
আপনি নিম্নলিখিতগুলি দ্বারা পদ্ধতিগুলিতে সুরক্ষিত এবং ব্যক্তিগত অ্যাক্সেস অনুকরণ করতে পারেন :
এই সুরক্ষাগুলি যেমন রচনার সময় প্রয়োগ করা হয়নি (যেমন তারা জাভাতে রয়েছে, উদাহরণস্বরূপ) noted
UIGestureRecognizerSubclass.h
সুরক্ষিত পদ্ধতিগুলি আমার উপশ্রেণীর কাছে দৃশ্যমান হয়ে ওঠার জন্য আমি এখানে কী করেছি, সেগুলি নিজেরাই পদ্ধতিগুলি প্রয়োগ করার প্রয়োজন ছাড়াই। এর অর্থ আমি আমার সাবক্লাসে অসম্পূর্ণ বাস্তবায়ন সম্পর্কে সংকলক সতর্কতা পাইনি।
সুপারক্লাসপ্রোটেক্টেড ম্যাথোডস.হ। (প্রোটোকল ফাইল):
@protocol SuperClassProtectedMethods <NSObject>
- (void) protectMethod:(NSObject *)foo;
@end
@interface SuperClass (ProtectedMethods) < SuperClassProtectedMethods >
@end
সুপারক্লাস.এম: (সংকলক এখন আপনাকে সুরক্ষিত পদ্ধতিগুলি যুক্ত করতে বাধ্য করবে)
#import "SuperClassProtectedMethods.h"
@implementation SuperClass
- (void) protectedMethod:(NSObject *)foo {}
@end
SubClass.m:
#import "SuperClassProtectedMethods.h"
// Subclass can now call the protected methods, but no external classes importing .h files will be able to see the protected methods.
performSelector
এটি করতে পারেন ।
[(id)obj hiddenMethod]
। সঠিকভাবে বলছি, সুরক্ষিত পদ্ধতিটি উদ্দেশ্য-সি তে সমর্থিত নয়।
আমি কেবল এটি আবিষ্কার করেছি এবং এটি আমার পক্ষে কাজ করে Adam অ্যাডামের উত্তরটি উন্নত করতে আপনার সুপারক্লাসে .m ফাইলে সুরক্ষিত পদ্ধতিটি প্রয়োগ করুন তবে এটি .h ফাইলে ঘোষণা করবেন না। আপনার সাবক্লাসে সুপারক্লাসের সুরক্ষিত পদ্ধতির ঘোষণার সাথে আপনার .m ফাইলে একটি নতুন বিভাগ তৈরি করুন এবং আপনি আপনার সাবক্লাসে সুপারক্লাসের সুরক্ষিত পদ্ধতিটি ব্যবহার করতে পারেন। এটি রানটাইমের সময় বাধ্য করা হলে চূড়ান্তভাবে অনুমিত সুরক্ষিত পদ্ধতির কলারকে রোধ করবে না।
/////// SuperClass.h
@interface SuperClass
@end
/////// SuperClass.m
@implementation SuperClass
- (void) protectedMethod
{}
@end
/////// SubClass.h
@interface SubClass : SuperClass
@end
/////// SubClass.m
@interface SubClass (Protected)
- (void) protectedMethod ;
@end
@implementation SubClass
- (void) callerOfProtectedMethod
{
[self protectedMethod] ; // this will not generate warning
}
@end
protectedMethod
@ সুরক্ষিত ভেরিয়েবলগুলি ব্যবহার করার আর একটি উপায়।
@interface SuperClass:NSObject{
@protected
SEL protectedMehodSelector;
}
- (void) hackIt;
@end
@implementation SuperClass
-(id)init{
self = [super init];
if(self) {
protectedMethodSelector = @selector(baseHandling);
}
return self;
}
- (void) baseHandling {
// execute your code here
}
-(void) hackIt {
[self performSelector: protectedMethodSelector];
}
@end
@interface SubClass:SuperClass
@end
@implementation SubClass
-(id)init{
self = [super init];
if(self) {
protectedMethodSelector = @selector(customHandling);
}
return self;
}
- (void) customHandling {
// execute your custom code here
}
@end
আপনি পিতামাত্ত শ্রেণীর একটি ব্যক্তিগত পদ্ধতি হিসাবে পদ্ধতিটি সংজ্ঞায়িত করতে পারেন [super performSelector:@selector(privateMethod)];
এবং শিশু শ্রেণিতে ব্যবহার করতে পারেন ।
আপনি এই বিভাগে বাছাই করতে পারেন ।
@interface SomeClass (Protected)
-(void)doMadProtectedThings;
@end
@implementation SomeClass (Protected)
- (void)doMadProtectedThings{
NSLog(@"As long as the .h isn't imported into a class of completely different family, these methods will never be seen. You have to import this header into the subclasses of the super instance though.");
}
@end
আপনি যদি অন্য শ্রেণিতে বিভাগটি আমদানি করেন তবে পদ্ধতিগুলি গোপন করা হয় না, তবে আপনি কেবল এটি করেন না। অবজেক্টিভ-সি এর গতিশীল প্রকৃতির কারণে কলিং ইনস্ট্যান্সের ধরণ নির্বিশেষে কোনও পদ্ধতি সম্পূর্ণভাবে আড়াল করা অসম্ভব।
যাওয়ার সর্বোত্তম উপায়টি সম্ভবত ব্রেইন ওয়েস্টফালের উত্তর অনুসারে ক্লাসের ধারাবাহিকতা বিভাগ তবে আপনার প্রতিটি উপবিষ্ট উদাহরণের জন্য আপনাকে এই বিভাগে পদ্ধতিটি নতুনভাবে সংজ্ঞায়িত করতে হবে।
একটি বিকল্প ব্যবহার করা বর্গ এক্সটেনশন আড়াল পদ্ধতি।
ইন .h
:
@interface SomeAppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
ইন .m
:
@interface SomeAppDelegate()
- (void)localMethod;
@end
@implementation SomeAppDelegate
- (void)localMethod
{
}
@end
@interface
না। M ফাইলটিতে আপনার ঘোষণার দরকার আছে । আপনি কেবল একটি ফাংশন ঘোষণা করতে এবং এটি ব্যবহার করতে পারেন এবং এটি ব্যক্তিগত হিসাবে বিবেচিত হবে।