在我的代码中,我有大约五个@property
语句;当我去找@synthesize = ...
他们时,有些在对象的下拉菜单中给我选择(属性名称),而有些则没有。我还发现,如果我没有_property
在我的方法中将所有属性都更改为,那么执行没有任何区别;该应用程序仍然有效。
为什么无论属性名称是否有下划线作为前缀,应用程序仍会运行?
在我的代码中,我有大约五个@property
语句;当我去找@synthesize = ...
他们时,有些在对象的下拉菜单中给我选择(属性名称),而有些则没有。我还发现,如果我没有_property
在我的方法中将所有属性都更改为,那么执行没有任何区别;该应用程序仍然有效。
为什么无论属性名称是否有下划线作为前缀,应用程序仍会运行?
你应该使用@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
or _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
s 来避免处理内存管理,但同样适用于对象)
在 32 位运行时,您可能会遇到问题,因为支持 ivars 的属性不是自动创建的……在 64 位模式或 iPhone 中,如果您创建了一个名为 _var 和属性 var 的 IVar,那么在合成时不要指定 _var,您将有 2 个 var,但是它将在 32 位 Mac OS 中损坏