内存管理

来源:互联网 发布:windows激活注销死循环 编辑:程序博客网 时间:2024/05/22 00:48

#import <Foundation/Foundation.h>

#import "Girl.h"

#import "Boy.h"

#import "Person.h"

int main(int argc,const char * argv[]) {

   

//    Girl *girl = [[Girl alloc]init];

//    Boy *boy  =[[Boy alloc] init];

//    girl.delegate = boy;

//    [girl getMarry];

    

    //内存溢出  没有释放

    //野指针异常对系统释放的内存进行访问

   // Manual Reference Count,人⼯引用计数

    

    //管理内存有三种方式

    //1.垃圾回收,java常见的管理方法,系统来检测对象是否被用,是否被释放

    //2.MRC手动引用计数,ios管理内存的方式

    //3.ARC自动引用计数

    

    

//    //对象被创建出来之后他的引用计数retainCount就变成1

//    Boy *boy = [[Boy alloc] init];

//    NSLog(@"%ld", boy.retainCount);

////

////    

////    //retain:对对象的引用计数加1

//    [boy retain];

//    NSLog(@"%ld", boy.retainCount);

//    [boy retain];

//    [boy retain];

//    NSLog(@"%ld", boy.retainCount);

//    

//    //release对对象的引用计数-1

//    [boy release];

//    NSLog(@"%ld", boy.retainCount);

//    [boy release];

//    [boy release];

//    NSLog(@"%ld", boy.retainCount);

//    [boy release];

//    NSLog(@"%ld", boy.retainCount);


//    //当对象的引用计数1 -> 0的时候,会自动调用dealloc,dealloc才是对应对象释放的方法

//    NSLog(@"%ld", boy.retainCount);

    //当对象调用release的时候,他的引用计数是1,这个对象就不在对他的引用计数进行-1,而是直接调用dealloc方法,所以我们再访问对象的引用计数还是1

    

    //如果多次对对象进行释放,会造成过度释放,过度释放也是常见的内存问题

    

    

    //    NSArray *arr =  @[@"1",@"2",@"3",@"4"];

//    NSLog(@"%ld", arr.retainCount);

//    

//    NSString *str = @"11111";

//    NSLog(@"%ld", str.retainCount);

//    

//    NSMutableString *str2 = [NSMutableString stringWithString:@"111111"];

//    NSLog(@"%ld", str2.retainCount);

//    

//    NSDictionary *dic = @{@"1":@"2",@"3":@"4"};

//    NSLog(@"%ld", dic.retainCount);

//    

//    NSLog(@"%p", str);

//    NSLog(@"%p", str2);


//    NSString的对在全局静态区,他的引用计数是-1,代表正整数的最大值,其他的对象都在堆区

    

//    Boy *boy = [[Boy alloc] init];

//    [boy retain];

//    [boy retain];

//    NSLog(@"%ld", boy.retainCount);

//    

//    [boy release];//release马上会把对象的引用计数-1

//    NSLog(@"%ld", boy.retainCount);

//    

//    [boy autorelease];//autorelease会延迟对对象的计数-1

//    NSLog(@"%ld", boy.retainCount);

    

    //自动释放池

    //只要对象用autorelease释放会把对象放到系统的自动释放池,等出了池子的范围,对象引用计数自动-1,这个相当于java的垃圾回收,对对象释放油系统来管理

//    @autoreleasepool {

//        [boy autorelease];

//        NSLog(@"%ld", boy.retainCount);

//    }

//

//    NSLog(@"%ld", boy.retainCount);

    

    //内存管理的原则:加多少,对应减多少

    

    //对象的所有权:拥有所有权的对象可以对他进行release

//    

//    Boy *b = [Boy boy];

//    [b retain];

//    NSLog(@"%ld", b.retainCount);

//    [b release];

//    //对象若果是我们进行的alloc或者retain之后我们就获得了对象的所有权就可以对对象进行release操作

//    

//    //遍历构造器在返回对象的时候会加上一个autorelese所以用便利构造器创建对象不需要对内存进行管理

//    NSArray *arr1 = [[NSArray alloc] initWithObjects:@"1",@"2", nil];

//    NSLog(@"%ld", arr1.retainCount);

    

    //id是泛型指针,可以用在任何的方法中,但是instancetype代表实例类型,uyongzai自定义初始化方法,便利构造器作为返回值类型使用,标识方法会返回一个对象回去

    

//    NSArray *arr = @[@"1",@"2",@"3",@"4"];

//    NSLog(@"%ld", arr.retainCount);

//   

//    NSArray *newArr = [arr copy];

//    NSLog(@"%@", newArr);

//    

//    NSArray *arr1 = [NSArray arrayWithArray:arr];

//    NSLog(@"%@", arr1);

//    

//    NSLog(@"%ld", newArr.retainCount);

    

    //不可变 ->可变

//    NSMutableArray *arr1 = [NSMutableArray arrayWithArray:arr];

//    [arr1 addObject:@"6"];

//    NSLog(@"%@",arr1);

//    

//    NSMutableArray *arr2 = [arr mutableCopy];

//    NSLog(@"%@", arr2);

//    

//    [arr2 addObject:@"5"];

//    NSLog(@"%@", arr2);

    

    

//    

//    NSDictionary *dic = @{@"1":@"2",@"3":@"4"};

//    NSMutableDictionary *muDic = [dic mutableCopy];

//    NSLog(@"%@", muDic);

//    

//    //系统的列要是实现copy的功能必须先签订NSCopying的协议燃火实现对应的方法

//    //不可变的数组字典可以通过mutableCopy变成可变的

//    //mutableCopy出来的对象是可变的

//    

//    Boy *boy = [Boy boyWithName:@"张阳阳" hobby:@""];

//    Boy *newBoy = [boy copy];

//    NSLog(@"%@", newBoy.name);

//    //如果自己的类想要实现copy的功能,就必须签订NSCopying,然后实现相应的协议方法initWithZone,之后就可以使用copy的功能

//    

//    NSLog(@"%ld", boy.retainCount);

//    NSLog(@"%ld", newBoy.retainCount);

    

    //copy也可以改变引用计数,但是他改变的是新对象的引用计数,而原先的对象计数不变

    

    //alloc开辟  dealloc 释放

    

//    Boy *boy1 = [[Boy alloc] init];

//    [boy1 retain];

//    [boy1 retain];

//    NSLog(@"%ld", boy1.retainCount);

//    NSMutableArray *arr = [NSMutableArray arrayWithObjects:boy1, nil];

//    NSLog(@"%ld", [arr[0] retainCount]);

//    

//    [arr removeObjectAtIndex:0];

//    NSLog(@"%ld", boy1.retainCount);

    //当对象放入到容器Array或者字典中,对象会被容器进行一次持有,就是return一次,他的引用计数会加1,主要为了防止空指针的问题

    //等对象从容器中移除掉,相应的会减1

//    

//    Boy *b = [[Boy alloc] init];

//    NSArray *arr = @[b];

//    [b release];

    

//    

//    Boy *b = [[Boy alloc] init];

//    Girl *girl = [[Girl alloc] init];

//    b.girls = girl;

//    NSLog(@"%ld", girl.retainCount);

    

    

//  //  完整的类

//    Person *per = [[Person alloc] initWithName:@"张阳阳" age:20];

//    [per.arr addObject:@"1"];

//    NSLog(@"%@", per.arr);

    

//  Boy.h

//  OC08,09_内存管理

//

//  Created by dllo on 15/7/27.

//  Copyright (c) 2015 dllo. All rights reserved.

//


#import <Foundation/Foundation.h>

#import "Girl.h"

@interface Boy : NSObject<GirlDelegate,NSCopying>


@property(nonatomic,retain)NSString *name;


@property(nonatomic,copy)NSString *hobby;



@property(nonatomic,retain)Girl *girls;


//自定义的初始化方法

- (instancetype)initWithName:(NSString *)name

                       hobby:(NSString *)hobby;



+ (Boy *)boyWithName:(NSString *)name

               hobby:(NSString *)hobby;



//  Boy.m

//  OC08,09_内存管理

//

//  Created by dllo on 15/7/27.

//  Copyright (c) 2015 dllo. All rights reserved.

//


#import "Boy.h"


@implementation Boy

- (void)cook{

   NSLog(@"吃吃吃");

}



- (void)dealloc{

    NSLog(@"对象被释放了");

    //把成员变量里+1的操作全部减去

    [_namerelease];

    [_girlsrelease];

    [_hobbyrelease];

        

    [superdealloc];

}



+ (Boy *)boy;



/Users/dllo/Desktop/c3循环结构/OC08,09_内存管理/OC08,09_内存管理副本.xcodeproj


0 0
原创粉丝点击