Czy istnieje sposób na uzyskanie czegoś podobnego do słownika wszystkich par klucz-wartość klasy?Czy istnieje sposób dynamicznego określania ivars klasy w czasie wykonywania w Cocoa/Cocoa Touch?
Odpowiedz
Musisz przeturlać się za pomocą Objective-C Runtime functions. Oto bardzo prosty przykładowy kod. Zauważ, że pobranie ivars z klasy nie daje ivars jej nadklasy. Trzeba to zrobić jawnie, ale wszystkie funkcje są dostępne w środowisku wykonawczym.
#import <objc/objc-runtime.h>
#include <inttypes.h>
#include <Foundation/Foundation.h>
@interface Foo : NSObject
{
int i1;
}
@end
@implementation Foo
@end
@interface Bar : Foo
{
NSString* s1;
}
@end
@implementation Bar
@end
int main(int argc, char** argv)
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
unsigned int count;
Ivar* ivars = class_copyIvarList([Bar class], &count);
for(unsigned int i = 0; i < count; ++i)
{
NSLog(@"%@::%s", [Bar class], ivar_getName(ivars[i]));
}
free(ivars);
[pool release];
}
Nie jestem pewien tylko dla ivars, ale jeśli masz je zdefiniowane jako właściwości, można uzyskać dostęp do dostępnych właściwości w klasie.
Używam SQLitePersistentObjects dla kilku projektów i ma kilka pomocny kod, który pobiera właściwości zdefiniowane na klasie do użycia przy obliczaniu serializacji do iz sqlite.
Używa funkcji class_copyPropertyList, aby uzyskać dostępną listę właściwości klasy.
Dokładniej:
+(NSDictionary *)propertiesWithEncodedTypes
{
// DO NOT use a static variable to cache this, it will cause problem with subclasses of classes that are subclasses of SQLitePersistentObject
// Recurse up the classes, but stop at NSObject. Each class only reports its own properties, not those inherited from its superclass
NSMutableDictionary *theProps;
if ([self superclass] != [NSObject class])
theProps = (NSMutableDictionary *)[[self superclass] propertiesWithEncodedTypes];
else
theProps = [NSMutableDictionary dictionary];
unsigned int outCount;
objc_property_t *propList = class_copyPropertyList([self class], &outCount);
int i;
// Loop through properties and add declarations for the create
for (i=0; i < outCount; i++)
{
objc_property_t * oneProp = propList + i;
NSString *propName = [NSString stringWithUTF8String:property_getName(*oneProp)];
NSString *attrs = [NSString stringWithUTF8String: property_getAttributes(*oneProp)];
NSArray *attrParts = [attrs componentsSeparatedByString:@","];
if (attrParts != nil)
{
if ([attrParts count] > 0)
{
NSString *propType = [[attrParts objectAtIndex:0] substringFromIndex:1];
[theProps setObject:propType forKey:propName];
}
}
}
free(propList);
return theProps;
}
ta zwraca słownika właściwości - trzeba zrobić kilka bada wyników wrócisz ale powinieneś być w stanie uzyskać to, czego potrzebujesz, jeśli jesteś używając właściwości.
Tak, całkowicie możliwe:
int numIvars = 0;
Ivar * ivars = class_copyIvarList([anInstanceOfAClass class], &numIvars);
NSMutableDictionary * pairs = [NSMutableDictionary dictionary];
for (int i = 0; i < numIvars; ++i) {
Ivar ivar = ivars[i];
NSString * ivarName = [NSString stringWithCString:ivar_getName(ivar) encoding:NSUTF8StringEncoding];
id ivarValue = [anInstanceOfAClass valueForKey:ivarName];
[pairs setObject:ivarValue forKey:ivarName];
}
free(ivars);
NSLog(@"%@", pairs);
- 1. Czy istnieje sposób na uzyskanie identyfikatora pakietu w czasie wykonywania?
- 2. Czy istnieje sposób dostępu do wstążki (XML) w czasie wykonywania?
- 3. czy można zastąpić metodę w czasie wykonywania?
- 4. Zmiana implementacji/klasy w czasie wykonywania
- 5. Rozmiar tablicy w czasie wykonywania bez przydzielania dynamicznego jest dozwolony?
- 6. Zmiana rozmiaru THREE.CubeGeometry w czasie wykonywania
- 7. Czy istnieje czysty sposób określania literałów znaków w Swift?
- 8. Powielanie składników w czasie wykonywania
- 9. Czy istnieje sposób dynamicznego ładowania pliku właściwości w NAnt?
- 10. Reguły określania klasy w Pythonie
- 11. dynamicznie zadeklaruj fasolę w czasie wykonywania na wiosnę
- 12. Czy można oglądać zmienne w czasie wykonywania?
- 13. Czy istnieje sposób wykonywania ASCX przez MVC?
- 14. Czy istnieje sposób, aby uzyskać bieżącą instancję Mocha i edytować opcje w czasie wykonywania?
- 15. Odlewanie do klasy, która jest określana w czasie wykonywania
- 16. Czy istnieje sposób statycznego wykonywania wiązania C#?
- 17. Czy istnieje skuteczny sposób wykonywania "ciągłego" autofokusu?
- 18. W jaki sposób GDB ocenia wyrażenia C++ w czasie wykonywania
- 19. Dodaj Ivars w @implementation
- 20. Ładowanie XAML w czasie wykonywania?
- 21. (de-) Serializować Bean w sposób niestandardowy w czasie wykonywania
- 22. metoda wywołania w czasie wykonywania
- 23. Czy istnieje sposób wykonywania łączenia między wieloma sesjami w sqlalchemy?
- 24. Czy istnieje sposób wykonywania zerowego kopiowania w .NET?
- 25. Czy istnieje sposób wykonywania sekwencyjnych powiązań w Clojure?
- 26. Czy istnieje sposób wykonywania tego rodzaju rzutowania w predykacie C#
- 27. C++ Przypisywanie wartości stałej w czasie wykonywania?
- 28. Dodaj właściwość do klasy POCO w czasie wykonywania
- 29. Rozszerzalność widoków ASP.NET MVC w czasie wykonywania
- 30. Czy istnieje sposób przechwytywania ekranu jako wideo w czasie rzeczywistym?
Ponieważ '' copy' class_copyIvarList' ma w nazwie, jesteś odpowiedzialny za czyszczenie pamięci. W związku z tym potrzebujesz również "free (ivars);". –
całkowicie w prawo. dzięki. – nall
To tylko druk Bar :: s1. Ale gdzie i1? –