Skip to content

Latest commit

 

History

History
82 lines (65 loc) · 6.05 KB

MulleDynamicObject.md

File metadata and controls

82 lines (65 loc) · 6.05 KB

MulleDynamicObject

Base class that provides dynamic property support in mulle-objc. Enables dynamic property access and automatic method generation for property accessors.

Base Class

NSObject

Instance Variables

struct mulle__pointermap   __ivars;  // Maps property names to values

Methods

Initialization

  • -init - Initializes the dynamic property storage

Dynamic Property Support

  • -forward: - Handles dynamic property access and method generation
  • +isFullyDynamic - Returns NO by default, can be overridden to enable fully dynamic mode

Internal Support

Usage Example

// 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

Important Notes

  1. 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
  2. Implementation Details

    • Creates accessor methods on demand
    • Caches property lookups for performance
    • Handles memory management automatically
    • Supports property observation
  3. Memory Management

    • Automatically releases stored objects
    • Manages memory for C strings
    • Cleans up in dealloc/finalize
  4. Restrictions

    • Cannot retain variadic method arguments
    • Cannot retain unions containing id or char*
    • Fully dynamic mode requires NSValue/NSNumber support
  5. 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
};