作者leondemon (狗狗)
看板MacDev
标题Re: [问题] 这种写法的意义?
时间Tue May 1 14:24:45 2012
※ 引述《yeah200077 (爹卡路洽)》之铭言:
: 常常看别人的Code会看到这种写法出现
: h档:
: NSString* _str;
: property(nonatomic,copy) NSString* str;
: m档:
: @synthesize _str = str;
: [_str release];
: 我想问的为什麽要另外宣告str assign给 _str有什麽意义?
: 我直接写成
: property(nonatomic,copy) NSString* _str;
: @synthesize _str;
: 好像也行,不懂为什麽会这样写
通常
// .h
@interface Foo{
NSString *_str; //
其实这行可以不用宣告
}
@property (nonatomic, copy) NSString *str;
@end
// .m
@implementation Foo
@synthesize str = _str;
@end
---------------
@synthesize指令会帮你匹配instance variable(ivar)
如果@interface没有宣告该ivar 则会自动帮你「合成」
另外也会帮你「合成」accessor的method
@property事实上只是帮你宣告accessor的method
另外也可以使用dot syntax来使用accessor
accessor因为是method,所以必须通过message来传递,例如:
[self setStr:aString];
aString = [self str];
或
self.str = aString;
aString = self.str;
至於为何要把ivar前面加上底线"_"
是因为要区别其他method的parameters
例如:
- (void) saveString:(NSString*)str{
_str = [str copy];
//也可以直接用self.str = str;
}
这样parameter就不会跟ivar相冲
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 115.30.67.74
1F:→ reon:所以@synthesize str = _str 其实就等於说用 05/01 15:56
@synthesize str
和
@synthesize str = _str
的差别,
只在於ivar是否要指定为其他名称 把私有的ivar用底线开头 比较好区分而已
如果你不指定ivar的名称 则会自动用accessor的名称来当做ivar的命名
2F:→ reon:_str 去取代 self.str 这样罗? 05/01 15:57
3F:→ reon:就不再需要透过dot syntax这样吗@@ 05/01 15:58
_str是instance variable (private by default)
dot syntax是property/accessor/message (public)
两者是截然不同的...
在get的时候你用ivar或是getter通常是没有差
(只差在getter因为是message 速度会慢一点点)
但是set的时候 setter会根据你property的设定来决定是否retain或copy(而且是message)
但是用ivar做设定,就要自己手动管理记忆体
不过我不是很确定在ARC开启的情况下 直接用ivar设定是否会帮你retain?
(理论上应该要是会)
※ 编辑: leondemon 来自: 119.77.246.75 (05/01 16:28)
4F:→ leondemon:property在许多Obc-C的书和官方文件都讲的很清楚 05/01 16:31
5F:→ reon:这样比较清楚了 =_str 目的原来只是别名.. 05/02 23:44
6F:→ reon:@property和synthesize 基本上我是很明白 只是一直没去了解 05/02 23:46
7F:→ reon:=_str 这个意义为何...感谢分享:D 05/02 23:46
8F:→ reon:不过倒是感觉这功能似乎有点鸡助@@"... 05/03 00:07
9F:→ Killercat:你可以想成是在.m里面的alias 05/04 00:04
10F:→ Killercat:在.h里面 式open的公开的 所以要写得很清楚(也许很长) 05/04 00:04
11F:→ Killercat:但是.m里面的alias你爱怎麽取就怎麽取(至少我是这样用) 05/04 00:05