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 |