Xcode中@synthesize
和@property
做了什么?请用非常简单的术语提供解释?
答案 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指南中提取的答案)