非ARC开发内存管理小总结
设计简单的微博模型:用User类和Status类来模拟实现
在非ARC机制下有两种方式,两者没有太大的区别之所以写了两种只是为了方便学习和对比两种写法!
第一种:没有使用atuorelease和自动释放池代码容易理解,但是开发中一般不这么写:
/****************************** User.h文件 **************************************/ /* 设计微博用户模型: 姓名、微博号码、密码、头像、性别、手机、生日 */ #import <Foundation/Foundation.h> // 枚举和结构体不用关心内存问题 typedef enum { SexMan, // 男 SexWoman // 女 } Sex; typedef struct { int year; int month; int day; } Date; @interface User : NSObject // 用户姓名 @property (nonatomic, retain) NSString *name; // 微博账号 @property (nonatomic, retain) NSString *account; // 微博密码 @property (nonatomic, retain) NSString *password; // 用户头像图片 设置为图片地址URL 比如: http://weibo.com/a.png @property (nonatomic, retain) NSString *icon; // 用户性别 @property (nonatomic, assign) Sex sex; // 用户手机 @property (nonatomic, retain) NSString *phone; // 用户生日 @property (nonatomic, assign) Date birthday; @end /****************************** User.m文件 **************************************/ #import "User.h" @implementation User - (void)dealloc { NSLog(@"User对象在释放之前先释放User对象引用的对象"); // 也可以理解为在User类中声明的retain类型在User类销毁后要全部销毁 [_name release]; [_account release]; [_icon release]; [_password release]; [_phone release]; [super dealloc]; } @end /****************************** Status.h文件 ***********************************/ /* 设计微博模型: 微博内容、微博配图、发送时间、微博发送人、转发的微博、被评论数、被转发次数 */ #import <Foundation/Foundation.h> #import "User.h" @interface Status : NSObject // 微博内容 @property (nonatomic, retain) NSString *text; // 微博配图 存放图片地址 @property (nonatomic, retain) NSString *icon; // 发送时间 计算机是从1970-01-01 00:00:00 开始计算到现在,一共度过了多少毫秒 @property (nonatomic, assign) long time; // @property (nonatomic) time_t time; 时间也可以用这个 // 微博发送人 @property (nonatomic, retain) User *user; // 转发的微博 依据面向对象的思想:将自己的类也封装成属性呢 @property (nonatomic, retain) Status *retweetStatus; // 被评论数 @property (nonatomic, assign) int commentsCount; // 被转发次数 @property (nonatomic, assign) int retweetsCount; @end /****************************** Status.m文件 ***********************************/ #import "Status.h" @implementation Status - (void)dealloc { NSLog(@"Status对象在释放之前先释放Status对象引用的对象"); [_text release]; [_user release]; [_retweetStatus release]; [_icon release]; [super dealloc]; } @end /****************************** main.m文件 ***********************************/ #import <Foundation/Foundation.h> #import "User.h" #import "Status.h" int main() { // 新建两个用户 并设置用户姓名 User *user1 = [[User alloc] init]; user1.name = @"张三"; User *user2 = [[User alloc] init]; user2.name = @"李斯"; // 新建两条微博 并设置微博的属性 Status *status1 = [[Status alloc] init]; status1.user = user1; // 这条微博是user1发出的 status1.text = @"今天真高兴呀!"; Status *status2 = [[Status alloc] init]; status2.user = user2; // 这条微博是user2发出的 status2.text = @"非ARC基本掌握了!"; status2.retweetStatus = status1; // user2用户在发出微博后又转发了条微博 [status2 release]; [status1 release]; [user2 release]; [user1 release]; return 0; }
第二种:使用atuorelease和自动释放池,在开发中建议的写法
/****************************** User.h文件 **************************************/ /* 设计微博用户模型: 姓名、微博号码、密码、头像、性别、手机、生日 */ #import <Foundation/Foundation.h> // 枚举和结构体不用关心内存问题 typedef enum { SexMan, // 男 SexWoman // 女 } Sex; typedef struct { int year; int month; int day; } Date; @interface User : NSObject // 用户姓名 @property (nonatomic, retain) NSString *name; // 微博账号 @property (nonatomic, retain) NSString *account; // 微博密码 @property (nonatomic, retain) NSString *password; // 用户头像图片 设置为图片地址URL 比如: http://weibo.com/a.png @property (nonatomic, retain) NSString *icon; // 用户性别 @property (nonatomic, assign) Sex sex; // 用户手机 @property (nonatomic, retain) NSString *phone; // 用户生日 @property (nonatomic, assign) Date birthday; + (instancetype)user; @end /****************************** User.m文件 **************************************/ #import "User.h" @implementation User + (instancetype)user { return [[[self alloc] init] autorelease]; } - (void)dealloc { NSLog(@"User对象在释放之前先释放User对象引用的对象"); [_name release]; [_account release]; [_icon release]; [_password release]; [_phone release]; [super dealloc]; } @end /****************************** User.m文件 **************************************/ #import "User.h" @implementation User + (instancetype)user { return [[[self alloc] init] autorelease]; } - (void)dealloc { NSLog(@"User对象在释放之前先释放User对象引用的对象"); [_name release]; [_account release]; [_icon release]; [_password release]; [_phone release]; [super dealloc]; } @end /****************************** User.m文件 **************************************/ #import "User.h" @implementation User + (instancetype)user { return [[[self alloc] init] autorelease]; } - (void)dealloc { NSLog(@"User对象在释放之前先释放User对象引用的对象"); [_name release]; [_account release]; [_icon release]; [_password release]; [_phone release]; [super dealloc]; } @end /****************************** main.m文件 ***********************************/ #import <Foundation/Foundation.h> #import "User.h" #import "Status.h" int main() { @autoreleasepool { // 新建2个用户 User *user1 = [User user]; user1.name = @"张三"; // NSString内部已经做好了封装不用关心内存 只是需要在引用的时候做次释放 User *user2 = [User user]; user2.name = @"李斯"; // 新建2条微博 Status *status1 = [Status status]; status1.text = @"今天真高兴呀!"; status1.user = user1; Status *status2 = [Status status]; status2.text = @"非ARC基本掌握了!"; status2.retweetStatus = status1; status2.user = user2; } return 0; }