Javier Cicchelli 9bcdaa697b [Setup] Basic project structure (#1)
This PR contains all the work related to setting up this project as required to implement the [Assignment](https://repo.rock-n-code.com/rock-n-code/deep-linking-assignment/wiki/Assignment) on top, as intended.

To summarise this work:
- [x] created a new **Xcode** project;
- [x] cloned the `Wikipedia` app and inserted it into the **Xcode** project;
- [x] created the `Locations` app and also, its `Libraries` package;
- [x] created the `Shared` package to share dependencies between the apps;
- [x] added a `Makefile` file and implemented some **environment** and **help** commands.

Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Reviewed-on: rock-n-code/deep-linking-assignment#1
2023-04-08 18:37:13 +00:00

37 lines
1.0 KiB
Objective-C

#import "NSObject+WMFReflection.h"
static inline void objc_propertyListRelease(objc_property_t **objectRef) __attribute__((overloadable));
static inline void objc_propertyListRelease(objc_property_t **objectRef) __attribute__((overloadable)) {
if (*objectRef != NULL) {
free((*objectRef));
}
}
#define freePropertyListOnExit __attribute__((cleanup(objc_propertyListRelease)))
@implementation NSObject (WMFReflection)
+ (void)wmf_enumeratePropertiesUntilSuperclass:(Class)superClass usingBlock:(WMFObjCPropertyEnumerator)block {
Class cls = self;
BOOL stop = NO;
while (!stop && ![cls isEqual:superClass]) {
unsigned count = 0;
freePropertyListOnExit objc_property_t *properties = class_copyPropertyList(cls, &count);
cls = cls.superclass;
if (properties == NULL) {
continue;
}
for (unsigned i = 0; i < count; i++) {
block(properties[i], &stop);
if (stop) {
break;
}
}
}
}
@end