目的是啥:@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 中是啥意思? [复制]
在类方法中访问类变量的正确方法是啥? self.class_variable 还是 class_name.class_variable?