为什么@synthesize没有显示某些@properties的选择?

时间:2012-06-29 22:04:31

标签: objective-c xcode

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

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

2 个答案:

答案 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中被破坏