我一直没能搞清楚,也没有网站能够清晰地解释...那么 @property
和 @synthesize
到底有什么作用呢?
谢谢。
我一直没能搞清楚,也没有网站能够清晰地解释...那么 @property
和 @synthesize
到底有什么作用呢?
谢谢。
Objective-C Runtime编程指南:Declared Properties
@property
声明了你想要实现的公共属性的getter和setter方法。例如,这个属性声明:
@property float value;
等同于:
- (float)value;
- (void)setValue:(float)newValue;
@synthesize
为这两个访问器提供了默认实现。
更新:上述内容解释了这两个访问器的工作,但并没有解释它们的目的。 :-)
@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
这里有一个快速示例说明,为什么你可能不想只使用 "variable = 0":
假设你有以下属性:
@property (nonatomic, retain) id <MyDelegate> theDelegate;
self.theDelegate = newObject;
实际上发生的是这样的:
[self setTheDelegate:newObject];
- (void)setTheDelegate:(id <MyDelegate>)anObject {
[theDelegate release];
theDelegate = [anObject retain];
}
(当然,这是简化的)
你可以在自己的setter和getter中做非常强大的事情,synthesize用于那些反复发生的保留属性等。编译时会查看你的@property并相应地构建方法。
->
操作符访问属性,也不能在类内省略self.
/self->
。此外,使用@property
声明的属性和手动编写访问器声明的属性之间没有功能上的区别。 - JeremyP