üzerinde yansımayı önler (objc/runtime) Hassas verileri işleyen statik bir kitaplık üzerinde çalışıyorum. Kütüphaneyi kullanan geliştiricinin kütüphanede yansımayı kullanması şart değildir. Android'de, iOS
, biz service
s ile bir aar
dosyasını geliştirerek sorunu çözmek ve ayrı sürecine service
işletilmektedir ve (hizmet sonra geliştirici yansıma kullanamaz başka bir süreç içine çalışırken) ama bir şey olmadığını merak ediyorum iOS'de benzer var mı?
Statik kütüphaneyi ayrı bir sürece uygulayabilir miyiz? değilse, statik kütüphanelerimizde yansımayı nasıl önleyebiliriz? Örneğin
:
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
benim kütüphaneden bir sınıftır. İlk satırda, bir nesneyi bu sınıftan başlatıyorum.
Bir sonraki satırda, sınıfın değişkenlerini, yöntemlerini ve özellik listesini okuyup kaydediyorum.
{
ivars = (
testValue
);
methods = (
printTestValue,
wannatTestIt,
"initWithFrame:"
);
properties = (
);
}
wannaTestIt
özel bir yöntemdir ve testValue
özel değişkendir: Sonuç ortada. Bu yüzden kütüphaneyi kullanan geliştiricinin bunlara erişemeyeceğini düşünüyorum. Bununla birlikte, kütüphanenin kullanıcısı ismini alabildiğinden, kullanıcı iVar'ın değerini okumak için en sonunda yönteme başvurabilir.
Bunu nasıl önleyebilirim?
Benim kütüphanemde uiviewcontrollers var. Uiview denetleyicilerini de destekleyen C++ kodları geliştirebilir miyiz? –
@HuseinBehboodiRad, tabi. UIViewControllers için değişiklik gerekmez. Sadece sıradan bir UIViewController' alt sınıfı oluşturun (“MyViewController” deyin), Objective C++ ile yazılmış uygulama sınıfını yaratın (“MyVCImpl” deyin). Ve cevabımda tarif ettiğim şeyleri aynen yap. 'MyViewController'' 'MyVCImpl' örneğine işaret eden _impl' ivar ekleyin. Tüm kamu yöntemlerini "_impl" ve "MyVCImpl" içindeki tüm özel yöntemleri/alanları saklamak için kullanın. Uygulama sınıfının içinden gerçek görüntü denetleyicisine erişmek için 'self'' MyVCImpl' öğesinin yapıcısına geçebilirsiniz. –