现代(64位OS X和iPhone OS)Objective C运行时的一个特性是属性能够动态合成ivars而无需在类中明确声明它们:
@interface MyClass : NSObject {
// NSString *name; unnecessary on modern runtimes
}
@property (retain) NSStrng *name;
@end
@implementation MyClass
@synthesize name;
@end
Run Code Online (Sandbox Code Playgroud)
在我的相当多的代码中,我使用自定义getter实现来初始化属性:
- (NSString *) name {
if (!name) {
name = @"Louis";
}
return name;
}
Run Code Online (Sandbox Code Playgroud)
以上与合成的ivars不兼容,因为它需要访问未在标题中声明的ivar.由于各种原因,我想更新一些我的个人框架,以便在现代运行时构建时使用合成的ivars,需要修改上述代码以使用合成的ivars来实现该目标.
虽然Objective C 2.0文档指出现代运行时的合成访问器将在首次使用时合成ivar.它没有指定使用什么低级机制来执行此操作.它是由class_getInstanceVariable()完成的,对class_addIvar()的限制是否松散,是否是一个未记录的函数在客观的C 2.0运行时?虽然我可以为支持我的属性的数据实现自己的副存储,但我更愿意使用合成访问器正在使用的机制.
我刚刚开始在我的iPhone项目中使用合成实例变量.问题是,我无法在调试器中看到合成的ivars.当没有使用显式声明的实例变量时,有没有办法在调试器中查看对象的属性?
我需要澄清第二个问题.我不是在询问如何访问属性或他们做什么; 我知道那些东西.我的印象是,在使用基于此帖子的合成ivars时,您无法直接访问实例变量.我显然能够做到我以前认为不可能的事情.我想知道发生了什么事.
我正在使用Xcode 3.2.4/iPhone模拟器/ LLVM编译器1.5.
在需要10.6并且是64位的mac os项目(意思不是iPhone)上工作,允许我使用属性在头文件中生成访问器方法和实例变量.但是,在调试期间,我没有看到如何在填充对象的属性值后查看它们.是否有一些需要打开的构建设置?
如果我声明一个对象的实例变量(在标题中的{}之间),那么我可以在调试期间在调试窗口本身中看到这些值(当它们被使用时),或者通过使用光标悬停在突出显示的线条技巧上在休息期间在编辑器中,或者像在'p*object'中那样在gdb中执行cli.
旧方式:
@class Suit;
@interface Card : NSObject
{
NSNumber *playOrder;
Suit *suit;
NSNumber *displayNumber;
NSNumber *orderIndex;
}
@property(nonatomic, retain) Suit *suit;
@property(nonatomic, retain) NSNumber *displayNumber;
@property(nonatomic, retain) NSNumber *orderIndex;
Run Code Online (Sandbox Code Playgroud)
新方法:
@class Suit;
@interface Card : NSObject
@property(nonatomic, retain) Suit *suit;
@property(nonatomic, retain) NSNumber *displayNumber;
@property(nonatomic, retain) NSNumber *orderIndex;
@property(nonatomic, retain) NSNumber *playOrder;
Run Code Online (Sandbox Code Playgroud)
在这个新的10.6需要64位的想法(这对我来说似乎更简单)这些调试方法都没有显示对象的值.我认为我必须关掉一些东西,因为这个新想法看起来并不好.
旧方式的gdb结果:
(gdb) po newCard
New Card : 0 of Suit : Hearts (NSCalibratedRGBColorSpace 1 0 0 1). with orderIndex of: 1
(gdb) p *newCard …Run Code Online (Sandbox Code Playgroud)