2011-05-03 63 views
4

使用obj-c中的属性,我们是否需要声明实例变量?使用obj-c中的属性,我们是否需要声明实例变量?

例如,如果我的.h文件看起来像这样:

@interface MyClass : NSObject { 
} 

@property (nonatomic, retain) NSNumber *someId; 
@property (nonatomic, retain) NSDate *expires; 
@property (nonatomic, retain) NSString *someString; 

... 

是罚款?它编译和工作,是'做过的事'吗?或者我应该真的做到以下几点:

@interface MyClass : NSObject { 
    NSNumber *someId; 
    NSDate *expires; 
    NSString *someString; 
} 

@property (nonatomic, retain) NSNumber *someId; 
@property (nonatomic, retain) NSDate *expires; 
@property (nonatomic, retain) NSString *someString; 

... 

如果我打算总是使用属性访问器,上述两种方法是否有区别?

@synthesize是否照顾为我创建实例变量?

+0

请[发布之前搜索(HTTP://计算器.com/search?q =%5Bobjc%5D + property + declare + ivar)[1](http://stackoverflow.com/questions/5031230/)[2](http://stackoverflow.com/questions/3336922 /)[3](http://stackoverflow.com/questions/4299487/)[4](http://stackoverflow.com/questions/4333797/)[5](http://stackoverflow.com/questions/ 4706816 /) – 2011-05-03 02:38:16

回答

5

您理解正确,@synthesize负责为您创建ivars。 (这是与64位Mac和iOS设备兼容的运行时的新功能。)

这样做的好处在于,您可以在您的class extension中@property并完全将您的ivars隐藏在.h中,完全分离从实现接口。

您也可以从.h中完全删除'{}',使其非常干净。

+0

如果我这样做,它会阻止我访问我的.m文件中的伊娃吗?我想被迫使用财产,例如'self.blah' – Chris 2011-05-03 02:05:43

+0

不,你仍然可以访问原始伊娃如果你觉得需要。 – 2011-05-03 02:23:08

+2

您仍然可以使用像@synthesize myProp = _myProp这样的语句来重命名iVar,以防止在没有getter的情况下意外使用。 iVar将被命名为_myProp。 – 2011-05-03 03:22:26

1

在苹果文档发现这一点:

随着现代运行时,如果你不提供实例变量,编译器增加了一个给你

相关问题