OC 中 Int 指针类型相关的作用域?

2015-01-15 11:51:43 +08:00
 Mr2
https://gist.github.com/MrTwo/0e02994a3b638dd78ee7

最近在学 OC 请问

`Async.m` 中的结果和 `WithoutAsync.m`的结果为何不同?
2201 次点击
所在节点    问与答
11 条回复
kkhaike
2015-01-15 12:14:29 +08:00
int* 在oc里不是对象,你就把他当值吧,在block里是没有block内strong列表保护的,你传入async后,这个函数内部栈值count都不知道哪里去了
canautumn
2015-01-15 12:49:40 +08:00
应该说清楚怎么个不一样法?
Mr2
2015-01-15 13:16:35 +08:00
@kkhaike 有办法强制保护么?
kkhaike
2015-01-15 13:17:49 +08:00
你把它过度到对象试试 NSNumber
Mr2
2015-01-15 13:18:59 +08:00
@canautumn 已 Append
Mr2
2015-01-15 13:19:56 +08:00
@kkhaike NSNumber的话不是不能 mutable 的么 还是无法传递吧?

除非 NSNumber ** ?
canautumn
2015-01-15 13:40:22 +08:00
@Mr2 那应该就是async调用count地址的时候,count已经超出生命周期被释放了。因为你声明了一个局部变量NSUInteger在栈上。(NSUInteger就是unsigned long,是个C类型,block是不会对C类型保留强引用的,更何况是在栈上的)你改用NSNumber*就可以了。不能修改的话就重新创建一个赋给count。
canautumn
2015-01-15 13:49:10 +08:00
或者自己写一个wrapper类。顺便,如果你malloc的话,在堆上新建一个NSUInteger* 也是可以的,不过就要手动释放内存了,这个就太扯淡了。问题的关键就在于NSUInteger不是一个类,没办法享受objc对类实现的自动内存管理,所以显然不适用于这种情形。所以两个错误,一是取指向栈的指针传给其他线程、二是在这种情形下应该用类,不能用基本C类型。
Mr2
2015-01-15 13:55:02 +08:00
@canautumn 好的 我试试看 谢谢你
kkhaike
2015-01-15 13:55:49 +08:00
看你的例子没有想过你中间可能还要变更值的情况,NSMutableArray中携带个NSNumber或者自己顶一个类用int属性都成
canautumn
2015-01-15 14:01:02 +08:00
@Mr2 不客气,我也是初学。我估计你也是先学过C++。内存管理这块得完全转变思维,objc和java更像,没有RAII。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/162354

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX