【问题标题】:Why does Xcode 4 auto-generate a instance variable?为什么 Xcode 4 会自动生成实例变量?
【发布时间】:2011-11-07 02:12:11
【问题描述】:

我来自 C# 开发,刚刚开始学习 Objective-C 和 Xcode 4。 据我了解,如果您不需要检查/控制正在读取或写入的值,“@synthesize”正在替换属性的 getter/setter 方法。

但是为什么 Xcode 4 会自动为我创建一个实例变量呢?

这还不够吗:

@synthesize myProperty;

代替:

@synthesize myProperty = _myProperty;

?

如果我没有/不需要任何 getter 或 setter,我为什么要使用/拥有实例变量而不是实际属性?

提前致谢!

孟菲斯

编辑:

我知道@synthesize 正在替换 getter/setter,但这部分有什么好处:= _myProperty;? 如果我可以直接使用“myProperty”,为什么还要有一个实例变量?如果设置器例如检查值的条件,我会理解使用“_myProperty”。如果我想跳过这个检查,我会使用 _myProperty。但是当我使用@synthesize 时,我没有一个设置器来做一些检查。那么为什么我有/想要一个实例变量呢?

回答:

查看 MattyG 帖子中的 cmets!

【问题讨论】:

  • @synthesize 会自动为你创建 getter 和 setter。你在类而不是实例变量上调用它。
  • 是的,但为什么我要在 .m 文件本身的方法中使用 _myProperty 而不是 myProperty?
  • 我不确定 _myProperty 是什么。这是一个 myProperty 对象的实例吗?如果您要在自己的方法中使用实例本身,请使用self。我不是很理解我猜的问题。对不起。

标签: objective-c ios xcode4 properties synthesize


【解决方案1】:

这是一个约定,用来提醒程序员通过带有self的setter和getter来访问实例变量。因此,如果您正在使用:

@synthesize myProperty = _myProperty;

然后要直接访问变量,您必须编写:

_myProperty = something;

要通过它的 setter 访问变量,您必须编写:

self.myProperty = something;

好处是如果你忘记通过 self.然后编译器会警告你:

myProperty = something;  //this won't compile

另请参阅Question

【讨论】:

  • +1 令人惊奇的是,Apple 在他们的课程中使用了这种技术,但没有在示例中使用它。使用这种技术可以省去很多麻烦。
  • 例如,您希望直接在对象 dealloc 方法中访问实例变量以释放它 [_myProperty release];。属性设置器可能会执行其他复杂的事情,例如通知等,这可能会导致其他对象对您的对象执行某些操作——这是您在解除分配时不想要的。所以你不会想在那里使用 [self.myProperty release]。
  • @sythesize 同时创建了 setter 和 getter。您仍然可以通过提供自己的方法来覆盖 setter,但保持合成的 getter 不变。
  • 顺便说一下,至于你原来的问题,是的,只使用@synthesize myProperty; 是完全可以的。我个人不使用下划线约定。
  • 不客气。不,对不起,我自己写了@sythesize 位。
【解决方案2】:

好吧,您在 .h 文件中声明了属性的实例变量,以及属性本身。属性的接口以及它将使用的实例变量已经建立了......它的实现还没有。这就是 @synthesize 关键字的用武之地。它只是为您实现属性,因此您不必自己写出来。

以下是在 C# 中声明属性的方法

private int _int1;
public int int1 {
  get { return _int1; }
  set { _int1 = value; }
}

这是一段非常常见的代码,C# 允许您对其进行缩写以避免一遍又一遍地键入相同的内容

public int int1 { get; set; }

这两个代码段的区别在于后者不存在私有变量“_int1”,因为C#内部创建了一个变量。 @synthesize 关键字很好,因为它可以让您省去一遍又一遍地编写相同代码的麻烦,同时仍然允许您访问它所基于的实例​​变量。

编辑。还需要注意的是,getter 和 setter 确实存在于 Objective C 中。它们的名称与 C# 中的名称不同,在 C# 中它们被标记为 get{} 和 set{}。在 Objective C 中,getter 是一个与其实例变量同名的方法,而 setter 是一个方法,其中单词 'set' 后跟实例变量名称,第一个字母大写。

所以,假设你的 .h 文件中有这个

int myVar;
...
@property(nonatomic, assign) int myVar;

你可以在.m文件中自己实现getter和setter

-(int)myVar {
  return myVar;
}

-(void)setMyVar:(int)newVar {
  myVar = newVar;
}

或者您可以使用@synthesize 自动编写getter 和setter

【讨论】:

  • 如果我使用 public int int1 { get;放;在 C# 中我没有/不需要 _int1 变量。这很清楚,但是为什么 Xcode 会为我创建一个呢?
猜你喜欢
  • 2011-03-17
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 2019-05-11
  • 2014-10-22
  • 1970-01-01
相关资源
最近更新 更多