返回信息流《Objective-C高级编程》第一章的GUNstep里有一段代码,讲得是引用计数的实现,我看不懂;
struct obj_layout {
NSUInteger retained;
}
+ (id) alloc {
int size = sizeof(struct obj_layout) + 对象大小;
struct obj_layout *p = (struct obj_layout *)calloc(1, size);
return (id)(p + 1);
}
inline NSUInteger NSExtraRefCount(id anObject) {
return ((struct obj_layout *)anObject)[-1].retained;
}
我想问这段代码((struct obj_layout *)anObject)[-1].retained;的语法是怎么回事?这是C的语法吗?为什么可以取指针的-1的位置,不怕出错吗?它怎么保证取到-1的位置时,该对象含有retained变量?
还是这是objective-c的语法?
求大神解答
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #28810同步于 2016/3/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
Objective-C的一个问题
sgoal
2016/3/2镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 ytinrete 的大作中提到: 】
: 对oc的中括号的抵触一直把我挡在学习的大门之外
: 所以遇到问题还是需要@apocalypse
搞搞 swift哟 很像js
会不会和你代码中第8行 return (id)(p + 1); 这个有关系啊。 你看 p 这个指针指的东西应该是obj_layout 后面跟着对象的吧,为了保证返回的对象是你想要的对象而不是带着 obj_layout 的所以就加一了?这样在之后控制引用计数的时候是不是应该就要减一了?
五楼正解.
alloc 返回的指针是p+1. 所以你通过一个obj去取obj_layout的话内存寻址的时候-1 找到obj_layout指针. 然后就可以访问 retained 了.
--------------
| obj_layout |
|------------- <- alloc 返回指针
| |
| obj |
|-------------|
中括号[-1]表示在取指针指向的内存的-1的位置是吧?这个位置就是obj_layout
【 在 lianweiqin 的大作中提到: 】是
: 五楼正解.
: alloc 返回的指针是p+1. 所以你通过一个obj去取obj_layout的话内存寻址的时候-1 找到obj_layout指针. 然后就可以访问 retained 了.
((struct obj_layout *)anObject)[-1].retained;中的[-1]是在对指针进行内存寻址是吧?找的事-1的位置?
【 在 zoolsher 的大作中提到: 】
: 会不会和你代码中第8行 return (id)(p + 1); 这个有关系啊。 你看 p 这个指针指的东西应该是obj_layout 后面跟着对象的吧,为了保证返回的对象是你想要的对象而不是带着 obj_layout 的所以就加一了?这样在之后控制引用计数的时候是不是应该就要减一了?
这个 [-1] 是C的语法. 我的理解是 (不一定对) 跟数组那个下标差不多 比方说 访问数组 a[0] a[1] ... 感觉 这个 xxx[-1] 是同理的 就是取前面一个元素的起始位置.
另外忘了之前在哪里看到的分析. GNUStep引用计数的实现和苹果真正的实现还是不一样的. 苹果的引用计数貌似不是这么存的.
引用计数这个东西懂他的意思就好了. : )
【 在 sgoal 的大作中提到: 】
: 中括号[-1]表示在取指针指向的内存的-1的位置是吧?这个位置就是obj_layout