पर प्रतिबिंब (objc/runtime) को रोकें, मैं एक स्थिर पुस्तकालय पर काम कर रहा हूं जो संवेदनशील डेटा को संभालता है। यह जरूरी है कि पुस्तकालय का उपयोग करने वाला डेवलपर लाइब्रेरी पर प्रतिबिंब का उपयोग नहीं कर सके।आईओएस
एंड्रॉयड पर, हम service
रों साथ एक aar
फ़ाइल के विकास के द्वारा समस्या का समाधान और अलग प्रक्रिया में service
चलाने, (जब सेवा तो डेवलपर प्रतिबिंब उपयोग नहीं कर सकते किसी अन्य प्रक्रिया में चल रहा है), लेकिन मैं अगर कुछ सोच रहा हूँ आईओएस में भी इसी तरह मौजूद है?
क्या हम एक स्थिर पुस्तकालय को एक अलग प्रक्रिया में निष्पादित कर सकते हैं? यदि नहीं, तो हम अपने स्थिर पुस्तकालयों पर प्रतिबिंब से कैसे बच सकते हैं?
उदाहरण के लिए:
MyTestObject *obj = [[[myTestView alloc] init ];
//===========================================
Class clazz = [obj class];
u_int count;
Ivar* ivars = class_copyIvarList(clazz, &count);
NSMutableArray* ivarArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* ivarName = ivar_getName(ivars[i]);
[ivarArray addObject:[NSString stringWithCString:ivarName encoding:NSUTF8StringEncoding]];
}
free(ivars);
objc_property_t* properties = class_copyPropertyList(clazz, &count);
NSMutableArray* propertyArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
const char* propertyName = property_getName(properties[i]);
[propertyArray addObject:[NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
}
free(properties);
Method* methods = class_copyMethodList(clazz, &count);
NSMutableArray* methodArray = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i < count ; i++)
{
SEL selector = method_getName(methods[i]);
const char* methodName = sel_getName(selector);
[methodArray addObject:[NSString stringWithCString:methodName encoding:NSUTF8StringEncoding]];
}
free(methods);
NSDictionary* classDump = [NSDictionary dictionaryWithObjectsAndKeys:
ivarArray, @"ivars",
propertyArray, @"properties",
methodArray, @"methods",
nil];
NSLog(@"%@", classDump);
//======================================================
int v2 = [[obj valueForKey:@"testValue"] intValue];
SEL s = NSSelectorFromString(@"wannatTestIt");
[obj performSelector:s];
MyTestObject
मेरी लाइब्रेरी से एक वर्ग है। पहली पंक्ति में, मैं इस वर्ग से एक वस्तु शुरू करता हूं।
अगली पंक्ति में, मैंने कक्षा के चर, विधियों और संपत्ति सूची को पढ़ा और इसे लॉग किया।
{
ivars = (
testValue
);
methods = (
printTestValue,
wannatTestIt,
"initWithFrame:"
);
properties = (
);
}
wannaTestIt
एक निजी तरीका है और testValue
एक निजी चर रहा है: यहाँ परिणाम है। इसलिए मैं उम्मीद करता हूं कि लाइब्रेरी का उपयोग करने वाले डेवलपर उन्हें एक्सेस नहीं कर सकते हैं। हालांकि, क्योंकि पुस्तकालय के उपयोगकर्ता को नाम मिल सकता है, उपयोगकर्ता अंततः iVar के मान को पढ़ने के लिए विधि को कॉल कर सकता है।
मैं इसे कैसे रोक सकता हूं?
मेरी लाइब्रेरी में uiviewcontrollers भी हैं। क्या हम C++ के साथ कोड विकसित कर सकते हैं जो uiviewcontrollers का भी समर्थन करते हैं? –
@HuseinBehboodiRad, निश्चित रूप से। UIViewControllers के लिए कोई बदलाव आवश्यक नहीं है। बस एक सामान्य 'UIViewController' subclass (कहें,' MyViewController') बनाएं, उद्देश्य C++ (कहें, 'MyVCImpl') में लिखित कार्यान्वयन वर्ग बनाएं। और वैसे ही वही काम करें जो मैंने अपने उत्तर में वर्णित किया है। 'MyViewController' में '_impl' ivar' MyVCImpl 'के उदाहरण को इंगित करते हुए जोड़ें। '_impl' के लिए सभी सार्वजनिक विधियों को प्रॉक्सी करें और सभी निजी विधियों/फ़ील्ड को 'MyVCImpl' के अंदर रखें। कार्यान्वयन वर्ग के अंदर से वास्तविक दृश्य नियंत्रक तक पहुंच प्राप्त करने के लिए आप 'MyVCImpl' के निर्माता को 'self' पास कर सकते हैं। –