有没有大神给解析下?

weak id a =nil

@autoreleasepool{

a=@{}

}

a=nil?

回答·20
最热
最新
  • weak 不会对原有对象内存计数+1 autorelease 会对代码块的内的临时变量进行释放,初期化后没有持有对象 所以是 nil
  • 应该不是 nil,因为加入到 autoreleasepoor 的对象不会立刻释放
  • a=@{} 如果@{}换成 nsobject 就是 nil 了 我猜测 @{}是 tag pointer 
  • 为啥要研究这种无聊的问题,真的想深入去看看汇编,就知道咋回事了,在外面猜来猜去没有意义
  • 关于自动释放池管理的是堆上的对象,a=@{},这种字面量写法,一般都是常量。没有引用计数管理,或者说不归程序员管,跟字符串常量一个道理。就算给 a 赋值@{@“2”:@“2"}也是一样,因为常量不存在引用计数问题。常量分配在全局区,系统管,程序员不管。这个换成[NSDictionary dictionaryWithObject:@"1" forKey:@"1"]才是我们平常理解的 OC 对象,才有对应的引用计数管理,就可以按照正常对象的思路。weak 引用,引用计数不变,自动释放池处理完后,引用计数变为 0,a=nil。 另外我看楼上有说 Tagged Pointer 的,的确这种也不存在程序员管理引用计数,[NSNumber numberWithInt:1]和@1,这种前者是 taggedPointer 指针,后者就是常量了。[NSNumber numberWithLongLong:131323123123123190]和@131323123123123190,前者是普通 NSNumber 对象,后者是常量。 都是我自己理解,也可能有问题,有问题怼就是了。
  • taggetpoint 不归 autoreleasepool 释放
  • 如果是 taggedpoint 会显示后面优化位保留的内容 例如 number 以及 string 等  字典这一类应该是 null(字典这个仅仅是我个人猜测) 这里显然是一个{} 不要忘记 autorelease page 以及 runloop 迭代的规律
  • weak 修饰的 a 被早早的注册到了 Autoreleasepool 里了,在自动释放池销毁的时候,会给 a 发送 release 消息,销毁对象 a, 然后再调用你手动加入的赋值操作,你要给一个不存在的对象赋值?
  • 都什么年代了还搞这些无聊的玩意
  • 这种情况在 ARC 下很可能编译器直接给你优化了