GPP*_*GPP 5 properties object objective-c ivar
我很困惑为什么有些类声明了一个属性但没有声明一个ivar,反之亦然.
声明实例变量同时将其声明为属性是标准做法吗?
例:
@interface AppDelegate : NSObject <UIApplicationDelegate>
{
UIWindow *window;
UINavigationController *navigationController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
Run Code Online (Sandbox Code Playgroud)
宣布一个班级的ivar使其成为一个属性时,这只是标准做法吗?
我知道@property创建了自己的拉长的setter(和@synethesize的getter),但为什么它也需要成为一个ivar?
Lil*_*ard 14
它没有.
在过去,人们需要宣布伊娃@interface.对于PPC和i386(即32位英特尔)目标,这实际上仍然是正确的.这是因为脆弱的基类问题,要求所有子类都知道其超类的确切大小.因此,ivars需要在@interface或者没有人可以继承类.
随着迁移到x86_64和ARM,与obj-c 2.0一起解决了脆弱的基类问题.通过此修复,不再需要在编译时知道类大小,而是可以将其延迟到运行时.因此,ivars可以在其他地方宣布.值得注意的是,现在可以从@property(更具体地说@synthesize,实施中的线)合成ivar .在Clang中,它们也可以在类扩展块(看起来像@interface ClassName ())或直接在@implementation.
今天,有三个原因可以解释为什么你会发现块中声明的ivars @interface:
在今天编写不需要以旧运行时为目标的代码时,您应该从属性中合成您的ivars(首选),或者如果您需要与属性无关的ivars,您应该在类扩展中声明它们或者你的@implementation.这样做的主要原因是头文件记录了您的类的公共API,并且不应包含任何不公开的API.Ivars不公开,因此不应该在头文件中.
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |