再次关于objective-c中的getter和setter

时间:2012-02-02 20:06:11

标签: objective-c ios

这是我的代码 Class.h

@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 ivar还是通过Synthesisize指令“生成”的getter和setter方法?

5 个答案:

答案 0 :(得分:2)

如果使用self.str = …,它只是[self setStr:…]周围的合成糖。所以你要经历setter方法。即使你得到self.str的值,你也会经历一个访问器 - 这对于了解你是否正在实现延迟加载的属性很有用。

您只能使用_str直接访问iVar,因为您(正确地,在我的意见中)声明这是后备存储的名称。

已编辑添加

您的示例存在问题 - 您已定义未使用的iVar str(iOS使用现代运行时,您无需为合成的属性声明iVars) 。因此,虽然您的代码正在写入后备存储_str,并且如果您直接访问self.str变量,那么这是通过str使用的存储,您将使用声明的iVar ,而不是你拥有财产的人。

答案 1 :(得分:1)

你的行

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

访问该属性。你的ivar名为_str。

如果您将它们命名为相同(即未在@synthesize行中将iVar重命名为_str),则self.str仍将访问该属性

str = @"This is a string";

将改为访问iVar。考虑到将这两者混合起来是多么容易,像你一样重命名iVar是一个非常好的习惯。

答案 2 :(得分:0)

一旦您使用“self。”,您就会访问该物业。如果您访问过“_str”,则可以访问ivar。

答案 3 :(得分:0)

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

使用

@synthesize str;

通过财产

访问ivar str

答案 4 :(得分:0)

当您使用self.something时,您使用的是属性本身而不是实例变量。有了这个说法,也可以创建属性而不必担心实例变量。看看这篇文章:

Objective-C Properties with or without instance variables