@property和@synthesize有什么意义?

时间:2010-07-03 00:33:01

标签: iphone ios4 objective-c-2.0

我无法弄清楚,而且没有网站能够清楚地解释清楚...... @property@synthesize的目的到底是什么?

提前致谢!

4 个答案:

答案 0 :(得分:13)

Objective-C Runtime Programming Guide: Declared Properties

@property声明要实现的公共属性的getter和setter方法。例如,这个属性声明:

@property float value;

相当于:

- (float)value;
- (void)setValue:(float)newValue;

@synthesize为这两个访问器提供默认实现。

更新:以上说明了这两个方面的作用。它没有解释他们的目的是什么。 : - )

  • @property将一个成员添加到公共接口,该公共接口充当类客户端的数据变量,但是使用方法读取和写入。这使您可以更好地控制客户端和代码之间交换的数据,例如,您可以对代码赋予的值进行扩展验证。
  • @synthesize允许您不显式编写客户端将调用的代码,并实际将该属性视为数据变量。

答案 1 :(得分:3)

编译器将“@”符号解释为指令。这是C语言的Objective-C'添加'之一。当您声明@property然后声明@synthesize时,您正在指示编译器为您创建getter和setter的指令和相应的符号。请记住,在C语言中,“=”运算符表示“赋值”。大多数时候,在Objective-C扩展提供的OO上下文中,我们使用指针(也称为引用)来构建数据结构(Objective-C中的类)。

在Objective-C 2.0之前,所有getter和setter方法都必须由开发人员为每个属性编码,在大多数情况下,这些属性都是复制/粘贴代码。要完全符合KVC / KVO,需要很多非常繁琐的代码... willAccessValueForKey,didUpdateValueForKey语句等新编译器在您使用@ property / @ synthesize语法时自动为您添加。这对开发人员来说是巨大的生产力提升。该语言的点语法添加在社区中更具争议性,因为它隐藏了编译器代表您执行的 magic ,将object.property = anotherObject.property;语句解释为[object setProperty:[anotherObject property]]; < / p>

来自其他答案中引用的Apple文档

财产声明属性

您可以使用@property(attribute [,attribute2,...])形式装饰属性。与方法类似,属性的作用域为其封闭的接口声明。对于使用以逗号分隔的变量名列表的属性声明,属性属性适用于所有命名属性。

如果使用@synthesize指令告诉编译器创建访问器方法,则它生成的代码与关键字给出的规范相匹配。如果您自己实现访问器方法,则应确保它与规范匹配(例如,如果指定了copy,则必须确保在setter方法中复制输入值)。

答案 2 :(得分:3)

我希望这会对你有所帮助。

@property和@synthesize用于访问对象或变量到另一个类。

这是一个小例子: 这是头等舱

#import <UIKit/UIKit.h>
#import "ClassB.h"
@interface ViewController : UIViewController
@property(nonatomic, retain) NSString *FirstName;
@property(nonatomic, retain) NSString *LastName;


#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize FirstName, LastName;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.FirstName = @"Ashvin";
    self.LastName  = @"Ajadiya";
    ClassB *ClassBOb = [[ClassB alloc] init];
    ClassBOb.ViewCntrlrOb = self;
    [ClassBOb CallMe];
}
@end

这是另一类:

#import <UIKit/UIKit.h>
@class ViewController;
@interface ClassB : UIViewController
@property(nonatomic, retain) ViewController *ViewCntrlrOb;
-(void) CallMe;
@end

#import "ClassB.h"
#import "ViewController.h"
@interface ClassB ()
@end
@implementation ClassB
@synthesize ViewCntrlrOb;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(void) CallMe
{
   NSLog(@"FirstName = %@",ViewCntrlrOb.FirstName);
   NSLog(@"LastName = %@",ViewCntrlrOb.LastName); 
}

因此,您可以将FirstName和LastName访问到ClassB。

他们打印:

2012-05-25 14:38:10.766 MyExample [8751:c07] FirstName = Ashvin 2012-05-25 14:38:10.768 MyExample [8751:c07] LastName = Ajadiya

答案 3 :(得分:0)

只是一个简单的例子,说明为什么你可能不想只做“variable = 0”:

说你有这个属性:

@property (nonatomic, retain) id <MyDelegate> theDelegate;

无论何时用新的代理替换该代理,每次设置时,您的综合setter和getter都会为您处理释放/保留:

self.theDelegate = newObject;

真的发生了这件事:

[self setTheDelegate:newObject];

- (void)setTheDelegate:(id <MyDelegate>)anObject {
    [theDelegate release];
    theDelegate = [anObject retain];
}

(当然这是简化的)

你可以在你自己的setter和getter中做很强大的事情,合成是为了那些反复发生的事情,比如保留的属性等。编译它时会查看你的@property并相应地构建方法。

相关问题