zoukankan      html  css  js  c++  java
  • iOS 非ARC基本内存管理系列总结6 -设计微博模型

    设计简单的微博模型:用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;
    }
  • 相关阅读:
    Unit app.service is not loaded properly: Exec format error
    No journal files were found.
    下一代存储技术的先行: NVDIMM 你了解吗?
    How To Share Data Between the Docker Container and the Host
    perl: warning: Please check that your locale settings:
    淘宝推荐、视频搜索背后的检索技术竟是它!深度揭秘达摩院向量检索引擎Proxima
    这可能是大型复杂项目下数据流的最佳实践
    MaxCompute在电商场景中如何进行漏斗模型分析
    技术干货 | 阿里云数据库PostgreSQL 13大版本揭秘
    ACK正式支持对基于Alibaba Cloud Linux操作系统的集群进行等保加固
  • 原文地址:https://www.cnblogs.com/QM80/p/3598319.html
Copyright © 2011-2022 走看看