【发布时间】:2010-01-09 08:34:30
【问题描述】:
@synthesize 和 @property 在 Xcode 中的作用是什么?请用非常简单的术语解释一下?
【问题讨论】:
标签: iphone
@synthesize 和 @property 在 Xcode 中的作用是什么?请用非常简单的术语解释一下?
【问题讨论】:
标签: iphone
您要求简单的术语:
@property 在你的 类头
@property (nonatomic, retain) NSString *myString;
@synthesize 创建你的 setter 和 您的财产的吸气剂(访问器 方法)
没有综合你必须写 你自己的 setter 和 getter 实现,如 getMyString 或 setMyString(第一个大写 您的财产的特征)
Sam:只是一个建议:http://www.cocoadevcentral.com/d/learn_objectivec/ 是学习属性等基础知识的非常可靠的资源。
祝你好运!
【讨论】:
属性和合成访问器是 Objective-C 2.0 中的新特性。
当您声明@property 时,您在某种程度上声明了一个实例变量。然后你 @synthesize 访问该属性的方法(即 getter 和 setter)。
如果您有兴趣,还有@dynamic 访问器。
你真的应该在这方面做足功课。苹果为此提供了漂亮的 pdf。
【讨论】:
将所有 Objective-c 魔法视为“更智能的宏”,就像“更智能的 #define 语句” @property 如果你注意到它总是在 h 文件中, @synthesize 始终在 m 文件中。 所以在后台 @property(随便)NSString *myString;
成为2个方法和一个私有变量的声明;
void set_myString:(NSString *) str;
(NSString*) get_myString;
头文件中的声明
为了让他们做一些事情,当你输入时,他们的实现被添加到 m 文件中 @synthesize myString; 这变成了类似的东西 无效 set_myString:(NSString *)str { 我的字符串 = str; }
(NSString *) get_myString
{
return (myString);
}
但它比这更聪明 取决于你说“保留”“强”还是“弱” 它要么只返回指向 myString 的指针,要么将 myString 复制到一个新对象中
所以所有这些都是由编译器自动完成的,只需阅读您的声明即可。 挺好用的,也省了很多时间
【讨论】:
默认情况下,我们所有的变量都是私有的,所以我们不能访问这个类。
如果我们想在类外使用我们的实例变量。
当您声明@property 时,您在某种程度上声明了一个实例变量。然后你 @synthesize 访问该属性的方法(即 getter 和 setter)。
如果您有兴趣,还有@dynamic 访问器。
【讨论】:
它只是在它自己的类中设置属性的 setter 变量名。
例如,假设我有这个:@property (nonatomic, copy) NSArray* viewControllers;
如果我想访问 setter _viewController 我不会设置综合变量。
但如果我想通过名称viewController 而不是_viewController 访问viewController 变量,我会使用@synthesize viewController;。
如果我想将其用作完全不同的名称,我可以这样做@synthesize viewControllers = viewControlololer;,但这只是二传手。您会注意到[self viewControllers] 仅有效,[self viewControlololer]; 无效
所以我不明白为什么每个人都写设置属性的“setter 和 getter”。它根本不会改变 getter 变量...除非这意味着 [self viewController] 知道 viewControlololer(显然)。
【讨论】:
实际上属性是隐式或显式合成的。属性是隐式合成的。因此,除非您想将变量的名称更改为不同于 _property_name 的名称,否则无需使用综合。
还有其他用例,例如,如果您不希望实例变量支持您的属性。
使用@synthesized 指令显式合成属性。
(摘自 Big Nerd Ranch 指南)
【讨论】: