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];
        
        

      

原文地址:https://www.cnblogs.com/zhangqing979797/p/13236892.html