【问题标题】:@property @synthesize@property @synthesize
【发布时间】:2010-01-09 08:34:30
【问题描述】:

@synthesize@property 在 Xcode 中的作用是什么?请用非常简单的术语解释一下?

【问题讨论】:

    标签: iphone


    【解决方案1】:

    您要求简单的术语:

    @property 在你的 类头

    @property (nonatomic, retain) NSString *myString;
    

    @synthesize 创建你的 setter 和 您的财产的吸气剂(访问器 方法)

    没有综合你必须写 你自己的 setter 和 getter 实现,如 getMyString 或 setMyString(第一个大写 您的财产的特征)

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

    祝你好运!

    【讨论】:

    • 是的,但没有它我的应用程序运行良好。那么,为什么需要它们?
    • 它们不是需要,它们只是用于节省时间和避免错误。
    • 在桌面上可以使用手动内存管理,也可以使用垃圾收集器。手动管理工作正常,但使用垃圾收集很有用、节省时间且错误更少。
    【解决方案2】:

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

    当您声明@property 时,您在某种程度上声明了一个实例变量。然后你 @synthesize 访问该属性的方法(即 getter 和 setter)。

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

    你真的应该在这方面做足功课。苹果为此提供了漂亮的 pdf。

    【讨论】:

    • 你能把我链接到pdf吗?
    • 如果您使用@property 和@synthesize,我应该在现代运行时(与iOS 和64 位Cocoa 一起提供)中添加它,您不需要在界面中声明支持iVar。这意味着更少的重复代码。
    • @Eimantas,您链接的 PDF 是基本的 Obj-C 手册。完全不针对这个问题。
    • @Eimantas - 如果 RTFM 是一个有效的答案,它将是 90% 的堆栈溢出问题的答案。
    【解决方案3】:

    将所有 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 复制到一个新对象中

    所以所有这些都是由编译器自动完成的,只需阅读您的声明即可。 挺好用的,也省了很多时间

    【讨论】:

      【解决方案4】:

      默认情况下,我们所有的变量都是私有的,所以我们不能访问这个类。 如果我们想在类外使用我们的实例变量。 当您声明@property 时,您在某种程度上声明了一个实例变量。然后你 @synthesize 访问该属性的方法(即 getter 和 setter)。

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

      【讨论】:

        【解决方案5】:

        它只是在它自己的类中设置属性的 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(显然)。

        【讨论】:

          【解决方案6】:

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

          还有其他用例,例如,如果您不希望实例变量支持您的属性。

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

          (摘自 Big Nerd Ranch 指南)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-23
            • 2010-10-22
            • 1970-01-01
            • 1970-01-01
            • 2011-07-05
            • 1970-01-01
            相关资源
            最近更新 更多