Base class that provides dynamic property support in mulle-objc. Enables dynamic property access and automatic method generation for property accessors.
NSObject
struct mulle__pointermap __ivars; // Maps property names to values
-init
- Initializes the dynamic property storage
-forward:
- Handles dynamic property access and method generation+isFullyDynamic
- Returns NO by default, can be overridden to enable fully dynamic mode
_MulleDynamicObjectValueSetter
- Sets value for dynamic property_MulleDynamicObjectNumberSetter
- Sets number value for dynamic property_MulleDynamicObjectValueGetter
- Gets value from dynamic property_MulleDynamicObjectForward
- Helper function for subclasses implementing forward:
// Create dynamic object with property
@interface MyDynamic : MulleDynamicObject
@property(dynamic) NSString *name;
@end
@implementation MyDynamic
@dynamic name;
@end
// Use dynamic property
MyDynamic *obj = [MyDynamic new];
obj.name = @"Hello"; // Uses dynamic setter
NSString *name = obj.name; // Uses dynamic getter
-
Property Types
- Supports primitive types through NSNumber wrapping
- Handles object properties with retain/copy/assign semantics
- Manages strings with strdup/free
- Supports NSValue for structs/unions
-
Implementation Details
- Creates accessor methods on demand
- Caches property lookups for performance
- Handles memory management automatically
- Supports property observation
-
Memory Management
- Automatically releases stored objects
- Manages memory for C strings
- Cleans up in dealloc/finalize
-
Restrictions
- Cannot retain variadic method arguments
- Cannot retain unions containing id or char*
- Fully dynamic mode requires NSValue/NSNumber support
-
Generic Types
typedef NS_ENUM(NSInteger, MulleObjCGenericType)
{
MulleObjCGenericTypeVoidPointer = 0, // as is
MulleObjCGenericTypeStrdup, // strdup/free
MulleObjCGenericTypeAssign, // just like void pointer
MulleObjCGenericTypeRetain, // retain/autorelease
MulleObjCGenericTypeCopy, // copy/autorelease
MulleObjCGenericTypeValue, // wrap into NSValue
MulleObjCGenericTypeNumber // wrap into NSNumber
};