@property @synthesize

时间:2010-01-09 08:34:31

标签: iphone

Xcode中@synthesize@property做了什么?请用非常简单的术语提供解释?

6 个答案:

答案 0 :(得分:16)

你问过简单的条款:

  

@property 在您的帐户中声明一个属性   类标题

@property (nonatomic, retain) NSString *myString;

  

@synthesize 创建你的setter和   吸引你的财产(访问者   方法)

     

如果没有合成,你必须写   你自己的二传手和吸气鬼   实现,如getMyString或   setMyString(大写第一个   你的财产的性质)

Sam:只是一个建议:http://www.cocoadevcentral.com/d/learn_objectivec/是一个非常可靠的资源,可以学习属性等基础知识。

祝你好运!

答案 1 :(得分:6)

属性和合成访问器是Objective-C 2.0中的新功能。

当您声明@property时,您声明了一个实例var。然后为该属性设置@synthesize访问器方法(即getter和setter)。

如果您有兴趣,还有@dynamic个访问者。

你应该真的做好这方面的功课。 Apple为此提供了精彩的pdf。

答案 2 :(得分:2)

将所有Objective-c魔术视为“更智能的宏”,就像“更智能的#define语句”     @property如果你注意到总是在h文件中,     @synthesize始终在m文件中。 所以在后台     @property(无论如何)NSString * myString;

成为2个方法和私有变量的声明;

void set_myString:(NSString *) str;
(NSString*) get_myString;

头文件中的声明

让他们做一些事情,当你输入时,他们的实现被添加到m文件中     @synthesize myString; 这变成了类似的东西     void set_myString:(NSString *)str     {       myString = str;     }

(NSString *) get_myString
{
  return (myString);
}

但它比这更聪明 取决于你是说“保留”“强”还是“弱” 它只会返回指向myString的指针,或者将myString复制到一个新对象

所以这一切都是由编译器通过阅读您的声明自动完成的。 这非常有用,可以节省大量时间

答案 3 :(得分:0)

默认情况下,我们所有的变量都是私有的,因此我们无法进入类中。 如果我们想在课外使用我们的实例变量。 当您声明@property时,您声明了一个实例var。然后为该属性设置@synthesize访问器方法(即getter和setter)。

如果您有兴趣,还有@dynamic个访问者。

答案 4 :(得分:0)

它只是在它自己的类中设置属性的 setter 变量名。 例如,我可以说:@property (nonatomic, copy) NSArray* viewControllers;

好吧,如果我想访问setter _viewController我不会设置合成变量。 但如果我想通过名称viewController而不是_viewController访问viewController变量,我会@synthesize viewController;

如果我想将它用作一个完全不同的名称,我可以这样做@synthesize viewControllers = viewControlololer;但这只是一个设定者。您会注意到[self viewControllers]仅有效,而不是[self viewControlololer];

所以我不明白为什么每个人都写一个属性的“setter and getter”。它根本不会改变getter变量......除非这意味着[self viewController]意识到viewControlololer(显然)。

答案 5 :(得分:0)

实际上,属性是隐式或显式合成的。属性是隐式合成的。因此,除非您想要将变量的名称更改为与_property_name不同的名称,否则无需使用合成。

还有其他一些用例,例如,如果您不想要一个实例变量来支持您的财产。

使用@synthesized指令显式合成属性。

(从Big Nerd Ranch指南中提取的答案)