BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #28810同步于 2016/3/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

Objective-C的一个问题

sgoal
2016/3/2镜像同步9 回复
《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的语法? 求大神解答
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
ytinrete机器人#1 · 2016/3/2
对oc的中括号的抵触一直把我挡在学习的大门之外 所以遇到问题还是需要@apocalypse
apocalypse机器人#2 · 2016/3/3
咦 我没有收到@ 这就是纯C...与 OC无关 至于这么写 为什么。。。呜呜呜 学艺不精 臣妾不知道啊亲╮(╯_╰)╭
apocalypse机器人#3 · 2016/3/3
【 在 ytinrete 的大作中提到: 】 : 对oc的中括号的抵触一直把我挡在学习的大门之外 : 所以遇到问题还是需要@apocalypse 搞搞 swift哟 很像js
wcxdell机器人#4 · 2016/3/3
应该是相同的类型连续放在一起,否则会有错误,首地址偏移一个数据类型的长度,猜测是让持有他的对象也+1? 发自「贵邮」
zoolsher机器人#5 · 2016/3/3
会不会和你代码中第8行 return (id)(p + 1); 这个有关系啊。 你看 p 这个指针指的东西应该是obj_layout 后面跟着对象的吧,为了保证返回的对象是你想要的对象而不是带着 obj_layout 的所以就加一了?这样在之后控制引用计数的时候是不是应该就要减一了?
lianweiqin机器人#6 · 2016/3/5
五楼正解. alloc 返回的指针是p+1. 所以你通过一个obj去取obj_layout的话内存寻址的时候-1 找到obj_layout指针. 然后就可以访问 retained 了. -------------- | obj_layout | |------------- <- alloc 返回指针 | | | obj | |-------------|
sgoal机器人#7 · 2016/3/5
中括号[-1]表示在取指针指向的内存的-1的位置是吧?这个位置就是obj_layout 【 在 lianweiqin 的大作中提到: 】是 : 五楼正解. : alloc 返回的指针是p+1. 所以你通过一个obj去取obj_layout的话内存寻址的时候-1 找到obj_layout指针. 然后就可以访问 retained 了.
sgoal机器人#8 · 2016/3/5
((struct obj_layout *)anObject)[-1].retained;中的[-1]是在对指针进行内存寻址是吧?找的事-1的位置? 【 在 zoolsher 的大作中提到: 】 : 会不会和你代码中第8行 return (id)(p + 1); 这个有关系啊。 你看 p 这个指针指的东西应该是obj_layout 后面跟着对象的吧,为了保证返回的对象是你想要的对象而不是带着 obj_layout 的所以就加一了?这样在之后控制引用计数的时候是不是应该就要减一了?
lianweiqin机器人#9 · 2016/3/5
这个 [-1] 是C的语法. 我的理解是 (不一定对) 跟数组那个下标差不多 比方说 访问数组 a[0] a[1] ... 感觉 这个 xxx[-1] 是同理的 就是取前面一个元素的起始位置. 另外忘了之前在哪里看到的分析. GNUStep引用计数的实现和苹果真正的实现还是不一样的. 苹果的引用计数貌似不是这么存的. 引用计数这个东西懂他的意思就好了. : ) 【 在 sgoal 的大作中提到: 】 : 中括号[-1]表示在取指针指向的内存的-1的位置是吧?这个位置就是obj_layout