1

在我的代码中,我有大约五个@property语句;当我去找@synthesize = ...他们时,有些在对象的下拉菜单中给我选择(属性名称),而有些则没有。我还发现,如果我没有_property在我的方法中将所有属性都更改为,那么执行没有任何区别;该应用程序仍然有效。

为什么无论属性名称是否有下划线作为前缀,应用程序仍会运行?

4

2 回答 2

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而不是iVaror _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:我使用ints 来避免处理内存管理,但同样适用于对象)

于 2012-06-29T22:45:53.423 回答
0

在 32 位运行时,您可能会遇到问题,因为支持 ivars 的属性不是自动创建的……在 64 位模式或 iPhone 中,如果您创建了一个名为 _var 和属性 var 的 IVar,那么在合成时不要指定 _var,您将有 2 个 var,但是它将在 32 位 Mac OS 中损坏

于 2012-06-30T16:25:40.333 回答