xinrong2019 / xinrong2019.github.io

My Blog
https://xinrong2019.github.io
1 stars 1 forks source link

20190528 IOS开发之OC手动内存管理 #33

Open xinrong2019 opened 5 years ago

xinrong2019 commented 5 years ago

OC手动内存管理

IOS4.0以后不需要手动管理内存,但是为了了解内存管理机制,有必要学习。

OC内存管理原则

在XCode中,开启MRC手动内存管理,默认是自动,学习完后记得改回来。

image

release

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    @public
    NSString *_name;
}

- (void)work;
@end

Person.m

#import "Person.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"person<%p>被销毁",self);//必须写在[super dealloc];前,否则访问不到
    [super dealloc];
}

- (void)work
{
    NSLog(@"%@在工作",_name);
}

@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [Person new];//MRC下,出现new,需要使用release销毁,否则会造成内存泄露
        [person work];
        [person release];

//        [person release];//程序抛出异常,访问了一个非法的内存地址
    }
    return 0;
}

输出结果

2019-05-28 10:09:14.620211+0800 OCIntroduce[2071:95236] (null)在工作
2019-05-28 10:09:14.620350+0800 OCIntroduce[2071:95236] person<0x1022045a0>被销毁
xinrong2019 commented 5 years ago

autorelease

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    @public
    NSString *_name;
}

+ (instancetype)person;
- (void)work;
@end

Person.m

#import "Person.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"person<%p>被销毁",self);
    [super dealloc];
}

+ (instancetype)person
{
    Person *person = [[[self alloc] init] autorelease];//调用autorelease,在@autoreleasepool {}内执行后就会自动释放

    return person;
}

- (void)work
{
    NSLog(@"%@在工作",_name);
}

@end

调用autorelease,在@autoreleasepool {}内执行后就会自动释放。

main.m

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [Person new];//MRC下,出现new,需要使用release销毁,否则会造成内存泄露
        [person work];

        [person release];

        //ARC下,会自动调用dealloc方法销毁

//        [person release];//程序抛出异常,访问了一个非法的内存地址

        Person *person1 = [Person person];
        [person1 work];
    }
    return 0;
}

输出结果

2019-05-28 10:12:52.932089+0800 OCIntroduce[2106:98285] (null)在工作
2019-05-28 10:12:52.932223+0800 OCIntroduce[2106:98285] person<0x102805160>被销毁
2019-05-28 10:12:52.932238+0800 OCIntroduce[2106:98285] (null)在工作
2019-05-28 10:12:52.932248+0800 OCIntroduce[2106:98285] person<0x102805160>被销毁