• OC基础 内存管理


    c语言中内存管理存在问题

            静态内存分配:

                局部变量 栈

                全局变量 数据区

            动态内存分配

            堆

            内存分配函数 malloc calloc realloc

            内存释放 free

            使用原则 用完了释放

            问题1. 内存泄漏 ,用完了动态分配的内存就不释放,就产生内存泄漏 解决 :用完malloc 用free

            问题2.有多个指针指向动态分配出来的内存 ,当这块内存通过其中任意一个指针被释放,指针都变成野指针。解决: 引用计数

            如果在用指针去释放内存,会出现过度释放的问题

            问题3。 函数如果返回一块动态分配内存的指针,有一个这块内存谁释放的问题

            

            

            对象所有权

            任何对象都可能拥有一个或者多个所有者,只要一个对象至少拥有一个所有者,他就会继续存在

            cocoa所有权策略

            -任何自己创建的对象都归自己所有

            -使用名字以 alloc new 开头或名字中包含 copy 的方法创建的对象

            -现在我们使用的是arc 在arc中,不用显示使用retain

            

            引用计数

        - retain

        - release

        - retainCount

    #import <Foundation/Foundation.h>
    #import "Test.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            NSNumber* n1=[[NSNumber alloc]init];
            NSNumber* n2 =[n1 retain];
            [n1 release];
            [n2 release];
            
            //1.创建一个对象
            Test* t1=[[Test alloc] init];
            NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]);
            //2.把对象加入数组对象中
            NSMutableArray *myArr=[NSMutableArray array];
            [myArr addObject:t1];
            NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]);
            //3.对象指针赋予assgin
            Test* t2=t1;
            NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]);
            
            //4.对象保留retain
            t2=[t1 retain];
            NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]);
            NSLog(@"t2 retain count=%lu",(unsigned long)[t2 retainCount]);
            //5 对象释放release
            [t1 release];
            NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]);
            //6.对象从数组中移除
            [myArr removeObjectAtIndex:0];
            NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]);
            [t1 release];
            
        
            
        }
        return 0;
    }

    oc中可变对象适用于引用计数 不可变对象不可用于引用计数

     h

    // mrc
    @interface Person : NSObject
    
    @property NSString* name;
    -(instancetype)ininWithName:(NSString*)n;
    -(void)show;
    
    @end
    
    NS_ASSUME_NONNULL_END

     m

    #import "Person.h"
    
    @implementation Person
    -(instancetype)ininWithName:(NSString*)n
    {
        self=[super init];
        if(self)
        {
    //        _name=n; //assign 没有对象全权限 mrc
            _name=[n retain]; //retain 如果一个类有一个对象成员 在使用指针使用retain 方法
        }
        return self;
    }
    
    -(void)show
    {
        NSLog(@"name:%@",_name);
    }
    
    -(void)dealloc
    {
        [_name release];
        [super dealloc];
    }
    @end

    main

      // oc中可变对象适用于引用计数 不可变对象不可用于引用计数
            // 常量字符串
            
            Person* p =[[Person alloc]ininWithName:@"zhangsan"];
            [p show];
            // 可变字符串
            
            NSMutableString* str2=[[NSMutableString alloc]initWithString:@"zhangsan"];
            Person* p2=[[Person alloc]ininWithName:str2];
            NSLog(@"retaincount=%lu",[str2 retainCount]);
            [str2 release];
            [p2 show];
            
            

          

  • 相关阅读:
    Docker 第二篇--安装Docker
    Docker 第一篇--初识docker
    VirtualBox 桥接上网方式的配置
    .NET服务器端按钮在客户端点击后禁用,服务端执行完事件后再次激活
    SignalR2.1部署IIS服务器无法推送消息
    SQL去掉某个字段重复记录
    动态生成WebService代理类
    openoffice启动服务并将office文件转换为pdf文件
    Hibernate 核心接口和工作机制
    linux下Mongodb集群搭建:分片+副本集
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/13236892.html
Copyright © 2020-2023  润新知