我无法弄清楚,而且没有网站能够清楚地解释清楚...... @property
和@synthesize
的目的到底是什么?
提前致谢!
答案 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并相应地构建方法。