我在一些iPhone示例中看到,属性在变量前面使用了下划线_.有谁知道这意味着什么?或者它是如何工作的?
我正在使用的接口文件如下所示:
@interface MissionCell : UITableViewCell {
Mission *_mission;
UILabel *_missionName;
}
@property (nonatomic, retain) UILabel *missionName;
- (Mission *)mission;
Run Code Online (Sandbox Code Playgroud)
我不确定上面做了什么,但是当我尝试设置任务名称时:
aMission.missionName = missionName;
Run Code Online (Sandbox Code Playgroud)
我收到错误:
请求成员'missionName'的东西不是结构或联合
如果您的公共界面中有属性,如下所示
@interface MyClass : NSObject
@property(strong) NSString *myProp;
@end
Run Code Online (Sandbox Code Playgroud)
然后合成它,实际上合成变量:
@implementation MyClass
@synthesize myProp = _myProp; // or just leave it at the default name..
@end
Run Code Online (Sandbox Code Playgroud)
实例变量的可见性是_myProp多少?也就是说,这是考虑过@public,@protected还是@private?我猜是因为MySubClass可以从那时继承MyClass它也会得到属性(自然),但是它还会继承实例变量可见性吗?
如果我将属性放在类扩展中会有什么不同?这会将属性隐藏在子类中,我也猜测实例变量.这记录在哪里?
如果我有一个@property我不想通过ivar我支持的,我只是省略了@synthesize并且有手动的getter,它返回了一个计算值.
但是,现在自Xcode 4.4以来我没有指定@synthesizedo编译器会自动生成它.这是否意味着它还会生成一个ivar我不需要/使用它的偶数?
我最终可以通过使用强制不自动合成dynamic.然而,这将是错误的,因为@dynamic如果getter和setter在其他地方或运行时实现,则应该用于关闭警告.
我正在开发构建iOS 6应用程序.
我有一个类TDBeam,它继承自超类TDWeapon.
超类TDWeapon在TDWeapon.h文件中声明了@property:
@interface TDWeapon : UIView
@property (nonatomic) int damage;
@end
Run Code Online (Sandbox Code Playgroud)
我没有明确地@synthesize属性,因为我让Xcode自动这样做.
在子类TDBeam中,我覆盖了TDBeam.m文件中的getter:
#import "TDBeam.h"
@implementation TDBeam
- (int)damage {
return _damage;
}
@end
Run Code Online (Sandbox Code Playgroud)
Xcode按预期自动完成getter方法名称.但是当我尝试引用_damage实例变量(继承自超类)时,我收到编译器错误:
Use of undeclared identifier '_damage'
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?我已经尝试显式添加@synthesize,并更改_damage ivar的名称,但编译器不会"看到"它或来自超类的任何其他ivars.我认为ivars是可见的,可以从子类访问?