Objective C provides a simpler way to declare and define accessor methods using declared properties. The language provides features to declare a property and to let compiler synthesize accessor methods.
The debugger lets developer inspect Objective C interfaces and their instance variables and class variables. However, the debugger does not know anything about the properties defined in Objective C interfaces. The debugger consumes information generated by compiler in DWARF format. The format does not support encoding of Objective C properties. This proposal describes DWARF extensions to encode Objective C properties, which the debugger can use to let developers inspect Objective C properties.
Objective C properties are always backed by an instance variable. The instance variables backing properties are identified using DW_AT_APPLE_property_name attribute. The instance variables with this attribute may not have data location attributes. The location of instance variables is determined by debugger only after consulting Objective C runtime.
@interface I1 { int n2; } @property p1; @property p2; @end @implementation I1 @synthesize p1; @synthesize p2 = n2; @end TAG_structure_type [7] * AT_APPLE_runtime_class( 0x10 ) AT_name( "I1" ) AT_decl_file( "Objc_Property.m" ) AT_decl_line( 3 ) TAG_member [8] AT_name( "p1" ) AT_APPLE_property_name(“p1”) AT_type( {0x00000147} ( int ) ) TAG_member [8] AT_name( "n2" ) AT_APPLE_property_name(“p2”) AT_type( {0x00000147} ( int ) )
Developers can decorate a property with attributes which are encoded using DW_AT_APPLE_property_attribute.
@property (readonly, nonatomic) int pr; TAG_member [8] AT_name(“pr”) AT_APPLE_property_name(“pr”) AT_type ( {0x00000147} (int) ) AT_APPLE_property_attribute (DW_APPLE_PROPERTY_readonly, DW_APPLE_PROPERTY_nonatomic)
The setter and getter method names are attached to the property using DW_AT_APPLE_property_setter and DW_AT_APPLE_property_getter attributes.
@interface I1 @property (setter=myOwnP3Setter:) int p3; -(void)myOwnP3Setter:(int)a; @end @implementation I1 @synthesize p3; -(void)myOwnP3Setter:(int)a{ } @end 0x000003bd: TAG_structure_type [7] * AT_APPLE_runtime_class( 0x10 ) AT_name( "I1" ) AT_decl_file( "Objc_Property.m" ) AT_decl_line( 3 ) 0x000003f3: TAG_member [8] AT_name( "p3" ) AT_APPLE_property_name(“p3”) AT_APPLE_property_setter(“myOwnP3Setter:”) AT_type( {0x00000147} ( int ) )
Attribute | Value | Classes |
---|---|---|
DW_AT_APPLE_property_name | 0x3fe8 | String |
DW_AT_APPLE_property_getter | 0x3fe9 | String |
DW_AT_APPLE_property_setter | 0x3fea | String |
DW_AT_APPLE_property_attribute | 0x3feb | Constant |
Name | Value |
---|---|
DW_AT_APPLE_PROPERTY_readonly | 0x1 |
DW_AT_APPLE_PROPERTY_readwrite | 0x2 |
DW_AT_APPLE_PROPERTY_assign | 0x4 |
DW_AT_APPLE_PROPERTY_retain | 0x8 |
DW_AT_APPLE_PROPERTY_copy | 0x10 |
DW_AT_APPLE_PROPERTY_nonatomic | 0x20 |