zoukankan      html  css  js  c++  java
  • OC 高级内存管理

    //
    //  main.m
    //  第8讲
    //
    /
    #import <Foundation/Foundation.h>
    #import "teacher.h"
    #import "classes.h"
    #import "man.h"
    #import "woman.h"
    #import "Student.h"
    #import "Card.h"
    /*
     
     类簇:
     多个类的组合,多个类来实现一个类的功能,相当于一个家族,派出一个代表,NSString,NSArray,NSDictionary,NSSet,都是对应的家族代表(代言人),但是oc中只允许但继承,一个类智能集成字一个父类,所以类簇不能有子类
     
     
     */
    
    
    
    
    
    
    int main(int argc, const char * argv[]) {
        
        //创建一个classes对象
    //    classes *lanou13=[[classes alloc] init];//0--1;
    //    //创建teacher 对象
    //    teacher *teache=[[teacher alloc] init];
    //    NSLog(@"teachecont=%ld",teache.retainCount);
    //    
    //    
    //    teache.name=[NSString stringWithFormat:@"xiaoli"];
    //    
    //    lanou13.teache=teache;//1--2;
    //    //原因 属性调用setter方法时,内部做了一次retain的操作
    //    NSLog(@"teachecont=%ld",teache.retainCount);
    //    
    //    //释放
    //    [lanou13 release];//1--0
    //    
    //    NSLog(@"teachecont=%ld",teache.retainCount);//因为teache对象在lanou13对象销毁时,已经release够一次所以会由2--1.
        
        //teacher *tea=[teacher teacherWithName:@"xiaobai" gender:@"m" age:27];
        //便利构造器内存管理--内部使用alloc 内部使用autorelease 外部无需管理内存
        
        
        //集合内存管理:(数组,字典,集合)
        /*
         集合内存管理:
         1.当往集合内添加元素(对象)时,呢么相应的对象引用计数会+1(会对添加的对象做一次retain操作)
         2.当移除集合内的一个元素(对象)时,被移除的对象引用计数会-1(会对被移除的对象做一次release操作)
         3.当该集合的引用计数为0时,在=销毁几个对象之前,会对集合内部的所有元素对象发送一个release消息,也就是集合内部的元素对象引用计数都会-1;
         
         
         */
        
    //    
    //    teacher *tea1=[[teacher alloc]init];//0--1
    //    teacher *tea2=[[teacher alloc]init];
    //    teacher *tea3=[[teacher alloc]init];
    //
    //    
    //    //创建可变数组,将teacher对象添加到数组当中
    //    
    //    NSMutableArray *teaMutArr=[[NSMutableArray alloc]initWithCapacity:0];//0--1
    //    NSLog(@"tea1count=%lu",tea1.retainCount);
    //    NSLog(@"teaMutArrcount=%lu",teaMutArr.retainCount);
    //    
    //    //将我们teacher对象添加到数组当中
    //    
    //    [teaMutArr addObject:tea1];//1--2
    //     NSLog(@"tea1count=%lu",tea1.retainCount);
    //    [teaMutArr addObject:tea2];//1--2
    //    [teaMutArr addObject:tea3];//1--2
    // NSLog(@"teaMutArrcount=%lu",teaMutArr.retainCount);
    //    
        //相应release一次
    //    [tea1 release];//2--1
    //    [tea2 release];//2--1
    //    [tea3 release];//2--1
        
    //    [teaMutArr release];
    //    //teaMutArr  1--0  销毁时,会向tea1, tea2, tea3 对象个发送一次release消息
    //    NSLog(@"teaMutArrcount=%lu",teaMutArr.retainCount);
    //    NSLog(@"tea1count=%lu",tea1.retainCount);
    //    
        
        
        /*
         ARC系统管理内存:
         ARC:自动引用计数(系统自动管理内存),由我们开发人员去开辟内存空间,但是不需要释放该内存空间,系统会自动释放该内存空间,本质上还是基于MRC的,只不过系统会自动添加了释放内存的方法,它不是垃圾回收机制
         
         */
        
        /*
         KVC:Key Value  它是间接访问实例变量的方式,为对象中对应的实例变量赋值调用setValue:forkey:
         
         
         */
        
    //    
    //    man *ma=[[man alloc]init];
    //    ma.name=@"张三";
    //    
    //    NSLog(@"%@",ma.name);
    //    
    //    //使用KVC赋值过程
    //    [ma setValue:@"李四" forKey:@"name"];
    //    
    //    //使用KVC取值
    //    NSString *name1=[ma valueForKey:@"name"];
    //    NSLog(@"%@",name1);
    //    
    //    woman *wom=[[woman alloc]init];
    //    //将女人指定为男人的妻子
    //    [ma setWomen:wom];
    //    
    //    //KVC:
    //    
    //    [ma setValue:wom forKey:@"wom"];
    //    
    //    
    //    //通过man对象为其中的woman对象的名字赋值
    //    
    //    ma.women.name=@"小花";
    //    
    //    //KVC
    //    [ma setValue:@"如花" forKeyPath:@"wom.name"];
    //    
    //    
    //    NSLog(@"name=%@",[ma valueForKeyPath:@"wom.name"]);
        
        
        Student *s=[[Student alloc]init];
        [s setName:@"小白"];
        [s setName:@"小丽"];
        
        //KVC方法
        [s setValue:@"小花" forKey:@"name"];
        [s setValue:@"" forKey:@"sex"];
        [s setValue:@"一米二" forKey:@"height"];
        NSLog(@"height=%@",[s valueForKey:@"height"]);
        
        
        Card *c=[[Card alloc]init];
        [s setValue:c forKey:@"card"];
        //student想要访问card里面 number变量
        //这里相当于是通过路径也就是card的属性number,然后将值赋值给他
        [s setValue:@"123456" forKeyPath:@"card.number"];
        NSLog(@"%@",[s valueForKeyPath:@"card.number"]);
        
        /*
         setvlaue : forkey:  key是不能传入路径card.number
         
         setvlaue : forkeypath:  keypath是可以传入key的(也就是可以传入路径)
         
         */
        
        //直接全部赋值
        [s setValuesForKeysWithDictionary:@{@"name":@"小丽",@"age":@"18",@"hobby":@"吃辣条",@"height":@"一米二"}];
        NSLog(@"%@",[s valueForKey:@"hobby"]);
      
        
        return 0;
    }
  • 相关阅读:
    js代码编写规范
    mysql数据库的水平拆分与垂直拆分
    git使用WebHook实现自动构建
    解决php
    laravel为模型中所有查询统一添加WHERE条件
    centos7+ 安装 php7.2
    nginx配置https
    git常用命令
    php如何应对秒杀抢购高并发思路
    nginx配置优化+负载均衡+动静分离详解
  • 原文地址:https://www.cnblogs.com/huyibo/p/5475349.html
Copyright © 2011-2022 走看看