作者Blueshiva (龙野南云)
看板MacDev
标题Re: [问题] property/synthesize之後...
时间Tue Dec 22 23:15:42 2009
※ 引述《leondemon (狗狗)》之铭言:
: 用property/synthesize一个物件变数A之後 (nonatomic, retain)
: 为什麽在method当中要对A进行操作时
: 在set的语法必须要用 self.A = something
: 而不能直接用 A = something
其实可以,因为A还是你物件里的一个变数,但是这边牵涉到一个问题
A是什麽?
如果是简单的资料型别,例如int float,那没问题,可以直接设定
但是如果是物件,那就爆了,因为A是一个指标
直接写 A = something 会改掉 A 指向的物件,所以原来指到的东西
就会变成无主孤魂,而且没有release掉,会有leak。新的物件也因为
没有retain,有可能会在别的地方被release掉,然後你的程式就bye了
: 可是get的时候可以直接用A (用self.A也可以)
: Why?
看得懂上面的话,为什麽这边可以用就很明显了。
所以基本上,请照规矩来,取资料用getter,设资料用setter,不要乱搞
--
Luna quieres ser madre
y no encuentras querer
que te haga mujer
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 112.104.95.143
1F:推 leondemon:所以getter的时候 无论用不用dot operator都不会出错罗? 12/22 23:26
2F:→ leondemon:setter部分我懂了 谢谢B大解说 12/22 23:27
3F:→ Blueshiva:你直接取用A的话,会直接取到A的值/物件,但是getter有 12/22 23:32
4F:→ Blueshiva:可能不是直接传回A的值,所以A/self.A有可能会有不同的 12/22 23:33
5F:→ Blueshiva:结果,也就是说,还是有可能出错(logical error) 12/22 23:33
6F:→ Blueshiva:不过话说回来,你是在synthesize的状况下用,getter应该 12/22 23:40
7F:→ Blueshiva:就是直接传回A的值/物件,所以在这种状况下是不会出错 12/22 23:41
8F:推 leondemon:我也是这样想 :) 不过对於你说可能会出错的状况很有兴趣 12/22 23:47
9F:→ uranusjr:所以我讨厌 dot syntax.... 12/22 23:48
10F:推 leondemon:顺便想问一下下面两个语意是否相同: 12/22 23:52
11F:→ leondemon:self.A = nil; 12/22 23:53
12F:→ leondemon:[A release]; //A为物件变数 12/22 23:53
13F:→ leondemon:在dealloc的时候 要release物件变数 两者是否都可使用? 12/22 23:54
14F:推 leondemon:当然self.A = nil写成[self setA: nil]会比较好 XD 12/22 23:57
15F:→ kenzou:如果self.A是pointer并已赋值,再把A指到nil会memory leak 12/23 00:20
16F:→ uranusjr:在这个状况而言是一样的, 不过建议是统一用 release, 以 12/23 00:24
17F:→ uranusjr:保持语法的一致性 12/23 00:24
18F:→ uranusjr:但如果 A 里面还有其他的 object pointer, 这样就会出事 12/23 00:25
19F:→ uranusjr:我回文好了 12/23 00:25