目的是什么:@synthesize variableName = __ variableName;

时间:2014-07-14 13:04:39

标签: ios xcode ios7

在我的Xcode Apple模板中,managedObjectContext在AppDelegate.m中合成,如下所示:

@synthesize managedObjectContext = __managedObjectContext;

我从未理解 = __managedObjectContext; 部分。请有人解释一下吗? (是否调用方法'managedObjectContext'?)

感谢。

3 个答案:

答案 0 :(得分:7)

为后台实例变量指定名称__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,也可以这样做。

答案 1 :(得分:1)

好问题。

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

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

对于声明为 readonly 的变量,我们无法分配任何值。但是,对于将变量创建为readonly的人,应在其程序中指定一个值。因此,为此,他通过合成来存储或引用相同的变量,并且可以使用self.managedObjectContext_managedObjectContext变量作为本地或私有变量{{1 }}

答案 2 :(得分:1)

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

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

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

要直接访问实例变量,您需要调用_x.

如果你想在没有下划线的情况下拨打x,你应该使用:

 @synthsize x = _x;