目的是啥:@synthesize variableName = __ variableName;

Posted

技术标签:

【中文标题】目的是啥:@synthesize variableName = __ variableName;【英文标题】:What is the purpose of: @synthesize variableName = __ variableName;目的是什么:@synthesize variableName = __ variableName; 【发布时间】:2014-07-14 13:04:39 【问题描述】:

在我的 Xcode Apple 模板中,managedObjectContext 像这样在 AppDelegate.m 中合成:

@synthesize managedObjectContext = __managedObjectContext;

我从来没有理解过 = __managedObjectContext; 部分。请问有人可以解释吗? (是调用方法‘managedObjectContext’吗?)

谢谢。

【问题讨论】:

没有目的了。如果您阅读文档,您会发现这是自动为您完成的,因此您不需要它。 我尝试了几次,但每次我在几个小时后醒来,都没有更明智的选择。请原谅我。 您是否阅读了 Apple 文档的封装数据部分? developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…这个文档会一一解释。 【参考方案1】:

这是给支持实例变量命名__managedObjectContext。如果您只是@synthesize managedObjectContext,则支持变量名为managedObjectContext

不过,有了这个@synthesize,就好像你在输入:

@implementation MyObject 
    ManagedObjectContextType __managedObjectContext;


- (ManagedObjectContextType)managedObjectContextType 
    return __managedObjectContext;


- (void)setManagedObjectContext:(ManagedObjectContextType *)managedObjectContext 
    __managedObjectContext = managedObjectContext;

(是的,我正在简化一点。)

以前,@synthesize 是必需的。现在,在大多数情况下,您可以跳过它。当你跳过它时,它相当于@synthesize managedObjectContext = _managedObjectContext(注意单下划线)。

它仍然有一些用处:如果您不包含 @synthesize 语句但包含 setter/getter,编译器将不会自动为您创建支持变量。即使您通过包含 @synthesize thing = _thing 来包含 getter/setter,您也可以这样做。

【讨论】:

感谢 Steven,这让事情变得更加清晰!非常感谢。【参考方案2】:

好问题。

您可以在项目的AppDelegate.h 文件中看到变量managedObjectContext 的声明,即,

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

对于声明为readonly的变量,我们不能赋值。但是,对于将变量创建为readonly 的人应该在他的程序中分配一个值。因此,为此他通过合成来存储或引用同一个变量,这样他就可以将self.managedObjectContext_managedObjectContext 变量用作本地或私有变量managedObjectContext

【讨论】:

其实有一种方法可以分配给只读属性。 感谢 Shiva 提供的信息。 @Popeye 你的意思是相反的吗? 没有。基本上,您可以在.h 文件中拥有像@property (readonly, nonatomic) NSManagedObjectContext *managedObjectContext; 这样的属性,因此它是公共的,因此其他类将其视为公共的,这很好(正确),您可以在.m 的私有接口中声明@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;该文件将为该类创建一个设置器,以便您可以在该类的任何位置设置变量(正确)。 现在这是可能出错的地方(并且确实如此)但仍然可以完成您声明一个调用私有设置器的公共方法,这意味着因为该方法是公共的,用户仍然可以设置属性,即使它是只读的。我开始了解到,没有什么是完全私人的,而且有一些骇人听闻的方法。请注意,我并不是说您的答案是错误的,只是认为我会对此有所不同+1【参考方案3】:

当您创建@property 2 方法时,会生成一个getter 和一个setter。 属性名称 x 的默认值,即 @property x,是:

-(void) setX:(int)x;
-(int) x;

每次调用 self.x 时都会调用 getter/setter。

为了直接访问实例变量,您需要调用_x。

如果你想调用不带下划线的 x,你应该使用:

 @synthsize x = _x;

【讨论】:

在 Cocoa 中,方法名称中的“get”一词通常表示使用输出参数,而不是 getter。 (来源:developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…) 正如Tuukka Norri 所说,getter 方法名称中没有get,因此您的答案不正确。 我很困惑 - 已修复。谢谢

以上是关于目的是啥:@synthesize variableName = __ variableName;的主要内容,如果未能解决你的问题,请参考以下文章

$VARIABLE+x 在 bash 中是啥意思? [复制]

Variable 是啥意思?它的定义是啥?简单的,谢谢!

@@variable 在 Ruby 中是啥意思?

scalar variable是啥意思

在类方法中访问类变量的正确方法是啥? self.class_variable 还是 class_name.class_variable?

environment variables是啥意思