这是我的代码 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方法?
答案 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;
通过财产
访问ivarstr
答案 4 :(得分:0)
当您使用self.something时,您使用的是属性本身而不是实例变量。有了这个说法,也可以创建属性而不必担心实例变量。看看这篇文章: