zoukankan      html  css  js  c++  java
  • ios 内存管理与property copy strong weak assign

    - (void)fun
    {
      NSString* str = [[NSString alloc] initWithString:@"string"];
      NSLog(@"%d", [str retainCount]);
    }
    可以看到 str的计数器为-1

    而把initWithString换成initWithFormat 计数器就是1

    ------解决方案--------------------------------------------------------
    没有区别.
    NSString本身没有什么特殊的,这里的问题在于使用常量字符串去初始化一个NSString,而系统会对常量字符串进行优化,所有引用同一个常量字符串的NSString共享同一块内存,这块内存位于常量区,引用计数为7fffffff,表示不使用通常的引用计数管理机制,不会释放. 
    ------解决方案--------------------------------------------------------
    @"string" 是常量,所以,它就没有开辟新的空间,仅是一个指针。initWithFormat 是要开辟空间滴⋯⋯

    block,苹果官方有说明,因为有上下文变量捕获,应该使用copy。

    • NSSring 用copy和strong区别

    本质上来讲,copy和strong都没有错,但不是说,NSString用copy就一定是最好的.

    那么,什么时候用copy,什么时候用strong呢?

    • 首先,为什么要用copy?
      因为copy安全!
      copy修饰的NSString,在初始化时,如果来源是NSMutableString的话,会对来源进行一次深拷贝,将来源的内存地址复制一份,这样,两个对象就一点关系就没有了,无论你怎么操作来源,都不会对自己的NSString有任何影响
      比如:
      你有一个@property(nonatomic,copy) NSString *str;
      然后有一个NSMutableString *sourceStr;
      当你进行str = sourceStr操作之后,紧接着你又改变了sourceStr的内容sourceStr = @"change";那么str的内容并不会改变. 如果你的str不是copy修饰的,而是strong修饰的,那么str的值也会变成@"change";因为strong是浅拷贝的,并不会对来源的内存地址进行拷贝
    • 那么问题来了,既然copy安全,那为什么不都用copy?
      这里我们需要了解一点,copy修饰的NSString在进行set操作时,底层是这样实现的:
      我们还是举上面那个例子,进行str = sourceStr操作时,内部会执行一个操作:
      str = [sourceStr copy];
      那么这个copy里面做了什么呢?
      if ([str isMemberOfClass:[str class]])
      没错,就是进行一次判断,判断来源是可变的还是不可变的,如果是不可变,那么好,接下来的操作就跟strong修饰的没有区别,进行浅拷贝;如果是可变的,那么会进行一次深拷贝
    所以,copy操作内部会进行判断,你别小看了这个if操作所消耗的内存,一次不重要,十次可能也可以忽略不计,但当你的项目十分庞大时,有成百上千个个NSString对象,多多少少会对你的app的性能造成一定的影响.
    • 那么回到最初的问题,什么时候用copy,什么时候用strong
    #你只需要记住一点,当你给你的的NSString对象赋值时,如果来源是NSMutableString,那么这种情况就必须要用copy;如果你确定来源是不可变类型的,比如@"http://www.jianshu.com/users/691d9ed740cf/latest_articles"这种固定的字符串,那么用strong比较好
  • 相关阅读:
    蓝桥杯 奇怪的比赛
    历届试题 古堡算式
    PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)
    PAT 甲级 1039 Course List for Student (25 分)(字符串哈希,优先队列,没想到是哈希)*...
    PAT 甲级 1038 Recover the Smallest Number (30 分)(思维题,贪心)
    PAT 甲级 1037 Magic Coupon (25 分) (较简单,贪心)
    那不是Bug,是新需求
    看看C# 6.0中那些语法糖都干了些什么(上篇)
    eclipse工具的使用心得
    送给那些刚进公司工作滴童鞋
  • 原文地址:https://www.cnblogs.com/dzhs/p/5343817.html
Copyright © 2011-2022 走看看