2015-10-19 iOS开发课程培训总结(七)
2015-10-19 iOS开发课程培训总结(七)
F_田鸡香也 发表于2年前
2015-10-19 iOS开发课程培训总结(七)
  • 发表于 2年前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0
摘要: 内存管理 、MRC、ARC、深浅拷贝


         今天复习了上周学习的内存管理,通过今天“人遛狗”的练习,用了图形表示的方法,更生动直接地给我们描述了在引用对象时该什么时候释放对象什么时候释放指针,对象和在指针释放前后的指向对象的计数器变化情况等,印象比较深刻。


            学习的新内容

        1、 关于retainCount为1 、 -1 、 0 、 无穷大的条件

    1:为对象计数,当创建对象时或者对象即将释放时为1,即对象计数器最小为1

    Person *personC = [[Person alloc]init];

  //  NSLog(@"personC retainCount: %lu", [personC retainCount]);

    

    0: 当一个指针为空指针的清空下,这个计数器为0

    Person *personD = nil;

//    NSLog(@"personD retainCount: %lu", [personD retainCount]);

    

    无穷大: 当一个数据类型被赋值时,它的retainCount为无穷大

    NSString *string = @"123";

//    NSLog(@"string retainCount: %lu", [string retainCount]);

    

    不可变的对象,通过被称为静态常量,这类对象一般不能用于计数,通过会有数据异常的情况,或无穷大或-1,一般可变的对象,通过是可以用来计数的吧。

    NSString *stringA = [[NSString alloc]init];

    NSMutableString *stringB = [[NSMutableString alloc]init];

    

//    NSLog(@"stringA retainCount: %lu, stringB retainCount: %lu",[stringA retainCount], [stringB retainCount]);

    

    2、深拷贝 与 浅拷贝

          涉及到关键词与相关的知识:1copy 2mutableCopy 3retain  4 =

    浅拷贝:通常指针对于指针进行拷贝,特点为:通过多个指针指向同一片内存地址

          深拷贝:所谓的深拷贝也就是赋值内容并且重新创建一块内存地址

         3、autoreleasePool 自动释放池(半自动释放)



    一般autoreleasepool之所以称之为半自动因为自动释放池通常有作用域,当在作用域范围内的特定(指半自动对象)的对象时,出去作用域才会计数器-1

    

    作用域

    @autoreleasepool {

     不叫特定的对象,因为没有什么特别

        Person *personQ = [[Person alloc]init];

        personQ.name = @"wangJiang";

        

    特定的对象,告诉作用域可以在出去的时候release一次

        Person *personP = [Person alloc];

        personP.name = @"daXiong";

    }特定的autorelease创建的对象才在出去的作用域的适合release 计数器 -1


        4、最后还学习了类之间相互引用时#import 和 @class 的使用




    



共有 人打赏支持
粉丝 0
博文 17
码字总数 12463
×
F_田鸡香也
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: