2012-02-02 35 views
1

这里是我的代码 Class.h再次约在Objective-C的getter和setter

@interface Class : NSObject 
{ 
    NSString *str; 
} 

@property (nonatomic, copy) NSString *str; 
@end 

@implementation Class 
@synthesize str = _str; 

-(void)someMethod 
{ 
    self.str = @"This is a string"; 
} 

在这里,我想不出不self.str访问STR伊娃直接或通过getter和setter方法“产生“通过合成指令?

+1

self.x = foo调用了二传手,并等价于[自setX的:FOO],同样适用于干将。如果你不使用self,那么你正在访问ivar,尽管只有str自己会是一个编译器错误,因为ivar被称为_str。 – 2012-02-02 20:11:53

回答

2

如果您使用self.str = …这只是[self setStr:…]附近的糖化糖。所以你正在通过setter方法。即使你通过self.str得到一个值,你正在经历一个访问器 - 这对了解你是否正在实现延迟加载的属性很有用。

因为您(正确地说,在我的意见中)宣称这是支持商店的名称,所以您只能直接在_str的情况下访问iVar。

编辑补充

没有您例如一个问题 - 你定义它不使用伊娃str(iOS的采用了现代化的运行时,你不需要申报的ivars对于你合成的属性)。因此,尽管您的代码正在写入支持存储_str,并且如果您要直接访问str变量,那么该存储正在通过self.str使用,您将使用声明的iVar,而不是您拥有属性的iVar。

+0

我没有看到他的代码中的任何地方,他已经将NSString Ivar声明为NSString * _str; ? – 2012-02-02 21:01:50

+0

@PeterWarbo这就是'@synthesize str = _str'正在做的事情。 iVar的实际声明正在被跳过,这是我只有在指出时才会注意到的错误。 – Abizern 2012-02-02 21:07:55

0

只要您使用“自我”,您就可以访问该属性。如果您曾经访问过“_str”,那么您将访问伊娃。

0

您将不会访问ivar str,因为属性str指的是_str

使用

@synthesize str; 

通过财产

1

你行

self.str = @"This is a string"; 

访问属性访问伊娃str。你的伊娃被命名为_str。

如果您已经将它们命名为相同的(即不改名伊娃在@synthesize线_STR),self.str仍然会访问属性而

str = @"This is a string"; 

反而会访问伊娃。考虑到将这两者混合起来是多么容易,重命名iVar是一种非常好的习惯。