Ios @synthesis variableName=\uuuu variableName;

Ios @synthesis variableName=\uuuu variableName;,ios,xcode,ios7,Ios,Xcode,Ios7,在我的Xcode Apple模板中,managedObjectContext在AppDelegate.m中合成如下: @synthesize managedObjectContext = __managedObjectContext; 我从来没有理解过managedObjectContext部分。有人能解释一下吗? (是否调用方法“managedObjectContext” 谢谢。这是为了给支持实例变量命名\uu managedObjectContext。如果您只是@synthesis man

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

@synthesize managedObjectContext = __managedObjectContext;
我从来没有理解过managedObjectContext部分。有人能解释一下吗? (是否调用方法“managedObjectContext”


谢谢。

这是为了给支持实例变量命名
\uu managedObjectContext
。如果您只是
@synthesis managedObjectContext
,则支持变量名为
managedObjectContext

不过,使用此
@synthesis
,您似乎键入了:

@implementation MyObject {
    ManagedObjectContextType __managedObjectContext;
}

- (ManagedObjectContextType)managedObjectContextType {
    return __managedObjectContext;
}

- (void)setManagedObjectContext:(ManagedObjectContextType *)managedObjectContext {
    __managedObjectContext = managedObjectContext;
}
(是的,我简化了一点。)

以前,需要使用
@synthesis
。现在,在大多数情况下,你可以跳过它。当您跳过它时,它相当于
@synthesis managedObjectContext=\u managedObjectContext
(注意单下划线)

它仍然有一些用途:如果您不包含
@synthesis
语句,但包含setter/getter,编译器将不会自动为您创建支持变量。您可以这样做,即使您通过包含
@synthetic thing=\u thing
来包含getter/setter,这是一个好问题

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

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

对于声明为只读的变量,我们无法分配任何值。但是,对于创建变量为
readonly
的人,应该在程序中指定一个值。所以为此,他通过合成同一变量来存储或引用同一变量,并且在创建@property 2方法时,他可以使用
self.managedObjectContext
\u managedObjectContext
变量作为局部或私有变量
managedObjectContext
,生成一个getter和二传手。 属性名称x(即@property x)的默认值为:

-(void) setX:(int)x;
-(int) x;
每次调用self.x时,都会调用getter/setter

为了直接访问实例变量,需要调用x

如果希望在不使用下划线的情况下调用x,则应使用:

 @synthsize x = _x;

再也没有目的了。如果你阅读文档,你会发现这是自动为你做的,所以你不需要它。我尝试了好几次,但每次我醒来几个小时后,没有一个更明智。请原谅。你读过苹果文档中的封装数据部分吗?在Cocoa中,方法名称中的“get”一词通常表示使用了输出参数,而不是getter。(来源:)正如
Tuukka Norri
所说,getter方法名称中没有
get
,因此您的答案是不正确的。我搞糊涂了-修复了它。谢谢实际上有一种方法可以分配给只读属性。谢谢Shiva的信息。@Popeye你是说另一种方法吗?不。基本上你可以拥有类似
@property(只读,非原子)NSManagedObjectContext*managedObjectContext
.h
文件中,因此它是公共的,因此其他类将其视为公共的,这是正确的,并且您可以拥有
@property(强,非原子)NSManagedObjectContext*managedObjectContext.m
文件的私有接口中声明code>,该文件将为该类创建一个setter,以便您可以在该类中的任何位置设置变量(正确)。现在这就是它可能出错的地方(实际上是)但是仍然可以这样做:您声明一个公共方法,该方法调用私有的setter,这意味着由于该方法是公共的,因此用户仍然可以设置该属性,即使它是只读的。我逐渐了解到,没有什么是完全隐私的,也有一些不正当的做法。请注意,我并不是说你的答案是错的,只是觉得我会对它进行不同的解读+1谢谢史蒂文,这让事情更清楚了!非常感谢。