V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Mr2
V2EX  ›  问与答

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

  •  
  •   Mr2 · 2015-01-15 11:51:43 +08:00 · 2092 次点击
    这是一个创建于 3402 天前的主题,其中的信息可能已经有所发展或是发生改变。


    最近在学 OC 请问

    `Async.m` 中的结果和 `WithoutAsync.m`的结果为何不同?
    第 1 条附言  ·  2015-01-15 13:18:21 +08:00
    WithoutAsync:
    ```
    block1:
    *count: 4
    count: 5821aa50
    block2:
    *count: 3
    count: 5821aa50
    ```

    Async:
    ```
    block1:
    *count: 4
    count: 5614aa50
    block2:
    *count: -1967044736
    count: 5614aa50
    ```
    11 条回复    2015-01-15 14:01:02 +08:00
    kkhaike
        1
    kkhaike  
       2015-01-15 12:14:29 +08:00
    int* 在oc里不是对象,你就把他当值吧,在block里是没有block内strong列表保护的,你传入async后,这个函数内部栈值count都不知道哪里去了
    canautumn
        2
    canautumn  
       2015-01-15 12:49:40 +08:00
    应该说清楚怎么个不一样法?
    Mr2
        3
    Mr2  
    OP
       2015-01-15 13:16:35 +08:00
    @kkhaike 有办法强制保护么?
    kkhaike
        4
    kkhaike  
       2015-01-15 13:17:49 +08:00
    你把它过度到对象试试 NSNumber
    Mr2
        5
    Mr2  
    OP
       2015-01-15 13:18:59 +08:00
    @canautumn 已 Append
    Mr2
        6
    Mr2  
    OP
       2015-01-15 13:19:56 +08:00
    @kkhaike NSNumber的话不是不能 mutable 的么 还是无法传递吧?

    除非 NSNumber ** ?
    canautumn
        7
    canautumn  
       2015-01-15 13:40:22 +08:00
    @Mr2 那应该就是async调用count地址的时候,count已经超出生命周期被释放了。因为你声明了一个局部变量NSUInteger在栈上。(NSUInteger就是unsigned long,是个C类型,block是不会对C类型保留强引用的,更何况是在栈上的)你改用NSNumber*就可以了。不能修改的话就重新创建一个赋给count。
    canautumn
        8
    canautumn  
       2015-01-15 13:49:10 +08:00
    或者自己写一个wrapper类。顺便,如果你malloc的话,在堆上新建一个NSUInteger* 也是可以的,不过就要手动释放内存了,这个就太扯淡了。问题的关键就在于NSUInteger不是一个类,没办法享受objc对类实现的自动内存管理,所以显然不适用于这种情形。所以两个错误,一是取指向栈的指针传给其他线程、二是在这种情形下应该用类,不能用基本C类型。
    Mr2
        9
    Mr2  
    OP
       2015-01-15 13:55:02 +08:00
    @canautumn 好的 我试试看 谢谢你
    kkhaike
        10
    kkhaike  
       2015-01-15 13:55:49 +08:00
    看你的例子没有想过你中间可能还要变更值的情况,NSMutableArray中携带个NSNumber或者自己顶一个类用int属性都成
    canautumn
        11
    canautumn  
       2015-01-15 14:01:02 +08:00
    @Mr2 不客气,我也是初学。我估计你也是先学过C++。内存管理这块得完全转变思维,objc和java更像,没有RAII。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3551 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:25 · PVG 19:25 · LAX 04:25 · JFK 07:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.