在我的代码中,我有大约五个@property
语句;当我去@synthesize = ...
时,有些人会在对象的下拉菜单中给我(属性名称)的选择,而有些则没有。我还发现,如果我没有在我的方法中将所有属性都更改为_property
,那么它在执行方面没有任何区别;该应用程序仍然有效。
为什么应用程序仍会运行,无论属性名称是否有下划线作为前缀?
答案 0 :(得分:2)
你应该使用@synthesize iVar = _iVar;
,但很快你就不需要合成了;)
我会说Xcode给出的选项只是代码完成有点儿错误。
严格来说,您使用的名称根本不重要(只要没有任何碰撞),@synthesize iVar = i_va_R;
完全合法,所以:
@synthesize foo = bar;
@synthesize bar = foo;
// DO NOT DO THIS IN REAL LIFE!!
您要说的是您希望该属性由具有给定名称的实例变量支持。如果你从不直接访问实例变量(总是使用self.iVar
而不是iVar
或_iVar
)那么它根本不重要你使用什么,它只对剩下的如果您想直接访问iVar,请输入代码。
为了澄清一点,这里是一个如何在不使用属性的情况下实现上述内容的示例:
@interface MyBadClass {
int foo;
int bar;
}
- (int)foo;
- (void)setFoo:(int)foo;
- (int)bar;
- (void)setBar:(int)bar;
@end
@implementation MyBadClass
- (it)foo
{
return bar;
}
- (void)setFoo:(int)foo
{
bar = foo;
}
- (int)bar
{
return foo;
}
- (void)setBar:(int)bar
{
foo = bar;
}
@end
(PS:我使用int
来避免处理内存管理,但同样适用于对象)
答案 1 :(得分:0)
在32位运行时,您可能会遇到问题,因为属性支持ivars不会自动创建...在64位模式或iPhone中,如果您创建一个名为_var的IVar和一个属性var,那么在合成时不要指定_var,您将拥有2 vars,但它将在32位Mac OS中被破坏