3

我想知道@property 和@synthesise 的意义是什么。目前我使用以下内容来声明一些东西:

//Class.m
#import "Class.h"

CCNode *node;

@implementation
//init, etc..

但我看到其他人使用:

@property (nonatomic, etc..) CCNode* node;
@synthesise (nonatomic, etc..) node;
//I am not too sure on how this type of declaration works, please correct me on how it's done.

它们似乎都以相同的方式工作,@property 和@synthesise 方式的优点是什么?他们做不同的事情吗?如果是,那是什么?

4

5 回答 5

5

@property并且@synthesize是两个客观的 C 关键字,可让您轻松创建属性,因此避免手动编写属性的 getter 和 setter 方法。

定义属性本身,应该放在头@property文件中并且可以获取一些属性(例如:strong、nonatomic、retainassign、copy),@synthesize应该放在实现文件中并告诉编译器生成body getter 和 setter 方法。

这两个关键字在正确使用它们的属性时非常有用,因为它们负责属性代码的生成,最重要的是它们负责属性的内存管理。

于 2012-05-29T12:47:30.420 回答
5

@property- 创建你的 getter 和 setter 的声明。

@synthesize- 根据在属性内部传递的参数提供 getter 和 setter 的定义。

看看这个,那里有更多关于同一个礼物的细节 - https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

于 2012-05-29T12:19:54.093 回答
2

使用@property编译器将负责基于 readonly 和 readwrite 声明 getter 和 setter 方法

readonly -> getterMethod

readwrite ->使用@synthesize编译器的 setter 和 getter 方法都将负责定义gettersetter方法

于 2012-12-11T16:46:56.630 回答
0

如果你的类中有一个实例变量(ivar),你通常不能从其他类访问它。因此,您必须创建公共访问器方法(getter 和 setter)。它们看起来像这样:

二传手:

- (void)setMyVariable:(SomeClass *)newValue {
    if (newValue != myVariable) {
        [myVariable release];
        myVariable = [newValue retain];
    }
}

吸气剂:

- (SomeClass *)myVariable {
    return myVariable;
}

这是在 Objective-C 2.0 之前你必须这样做的方式。现在您可以使用@property 和@synthesize 来加快速度。它基本上只是一个捷径。

在标题中,您使用 @property 来定义您想要的设置器类型。setter 应该保留传递的值(如我的示例中)还是复制或只是分配?

在实现中,您只需编写 @synthesize 以使编译器在该位置包含自动创建的 getter 和 setter。通常在您的实施的顶部。

于 2012-05-29T12:24:51.110 回答
0

我的感觉是所有 iVar 都应该有一个关联的下划线综合属性(使用 _iVar 可以防止意外的直接访问),并且除了 init 和 dealloc 方法之外,对 iVar 的所有访问都应该通过该属性。

恕我直言,最大的胜利是内存管理——它更安全、更容易,因为无需记住保留了哪些 iVar。

想想编写一个访问器需要做多少工作——4 行用于获取器,2 行用于设置器。

在未来@synthesize的某个时候可能是可选的,所以您只需要@property.

于 2012-05-29T12:32:01.327 回答