首页 > 学院 > 开发设计 > 正文

iOS非ARC基本内存管理系列5-autorelease方法使用总结

2019-11-14 20:37:15
字体:
来源:转载
供稿:网友

autorelase:可以将对象交给自动释放池中,释放池销毁的时候对里面的对象做一次release操作代码如下

    @autoreleasepool {        Person *person = [[[Person alloc] init] autorelease];    }
上面代码虽然正确,但是为了简化代码在开发中一般是提供一个类方法来专门创建对象,并且将管理内存的代码封装到类方法中:
注意:定义方法名的时候以类名开头,返回类型为instancetype,而且在创建对象的时候使用self关键字
/******************************** Person.h文件 ********************************************/
#import
<Foundation/Foundation.h>@interface Person : NSObject@PRoperty (nonatomic,assign) int age;+ (instancetype)person;+ (instancetype)personWithAge:(int)age;@end/*********************************** Person.m文件 ********************************/#import "Person.h"@implementation Person
// 类方法命名以类名开头
+ (instancetype)person{ Person *person = [[[self alloc] init] autorelease]; // 用self后Person类不仅可以快速创建对象 如果有子类继承Person也可以创建对象
   return person; 
}

+ (instancetype)personWithAge:(int)age { Person *person = [self person];
   person.age = age;
   return person;}
- (void)dealloc{ NSLog(@"%d岁的Person对象被销毁",_age); [super dealloc];}@end/*********************************** mian.m文件 ********************************/#import <Foundation/Foundation.h>#import "Person.h"
int main(int argc, const char * argv[]){ @autoreleasepool { Person *person = [Person person]; person.age = 30;
Person
*Person2 = [Person personWithAge:20]; } return 0;}
上面代码中是模拟系统写法:即方法中没有alloc,new,copy说明返回的对象都是autorelease过的对象,不用release或autorelease
而且系统中的很多方法也是遵照这个原则,比如下面代码
@autoreleasepool {
int a = 20;
NSString
*str = @"abc"; NSString *str2 = [NSString stringWithFormat:@"%d",a]; NSNumber *num = [[NSNumber alloc] initWithInt:a]; [num release];
}
可以看出在创建NSString类对象的时候就不用关心内存问题,系统已经在底层实现了对内存的管理。但是如果系统方法中涉及到了alloc,new,copy还需要去管理内存

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表