我刚刚开始在我的iPhone项目中使用合成实例变量.问题是,我无法在调试器中看到合成的ivars.当没有使用显式声明的实例变量时,有没有办法在调试器中查看对象的属性?
我需要澄清第二个问题.我不是在询问如何访问属性或他们做什么; 我知道那些东西.我的印象是,在使用基于此帖子的合成ivars时,您无法直接访问实例变量.我显然能够做到我以前认为不可能的事情.我想知道发生了什么事.
我正在使用Xcode 3.2.4/iPhone模拟器/ LLVM编译器1.5.
我已经看过代码示例(来自"初学iPhone 4开发"一书),它们都在接口块中声明了ivars,然后声明了相同的属性.像这样:
@interface ViewController : UIViewController {
UITableView *table;
}
@property (nonatomic, retain) IBOutlet UITableView *table;
Run Code Online (Sandbox Code Playgroud)
这个的目的/好处是什么?据我所知,使用现代运行时版本(iPhone和64位OS X应用程序),您只需要声明属性,并且可以省略声明接口块内的ivars.根据similair线程中的这个答案,它将用于调试目的.但除了调试之外还有其他任何好处,你会使用这种方法吗?
干杯,
彼得
iphone properties objective-c instance-variables modern-runtime
类扩展的一个强大优势是,使用类扩展,您可以在头文件中声明readonly属性,并在类扩展中将此属性覆盖为readwrite属性.如下所示:
//SomeClass.h
@interface SomeClass : NSObject
{
NSInteger someInt; //with modern runtime you can omit this line
}
@property (readonly) NSInteger someInt;
@end
//SomeClass.m
@interface SomeClass ()
@property (readwrite) NSInteger someInt;
@end
@implementation SomeClass
@synthesize someInt;
@end
Run Code Online (Sandbox Code Playgroud)
但是如果你使用现代运行时,你也可以在类扩展中声明一个全新的属性(如果没有,也为该属性生成一个iVar).
//SomeClass.h
@interface SomeClass : NSObject
{
}
@end
//SomeClass.m
@interface SomeClass ()
@property (readwrite) NSInteger someInt;
@end
@implementation SomeClass
@synthesize someInt;
@end
Run Code Online (Sandbox Code Playgroud)
这是我的问题:我认为在课堂扩展中声明一个全新的属性在某种程度上会产生一些副作用.因为类扩展我不在头文件中,而另一个继承类的人可能不知道那个"秘密属性".如果他宣布一个与该"秘密财产"同名的财产.而这个新属性的getter和setter方法将覆盖超类.这不是问题吗?为什么现代运行时会允许这样的事情发生?
编辑我发布了关于这个主题的另一个问题,请查看: 在类扩展(Ojbective-C)中声明新的propery的风险,如何解决?