zoukankan      html  css  js  c++  java
  • oc48--多个对象内存管理练习

    //
    //  main.m
    //  多个对象内存管理练习
    //
    //  ARC是Xcode帮我们生成内存释放的代码,MRC是需要我买自己写retain和release。想研究内存管理只能在MRC,管理对象就是在管理引用计数器,计数器为0对象就释放。
    //  给空指针发消息不会报错,给野指针发消息就会报错。
    //  对象与对象之间有关系时候就用retain。
    
    #import <Foundation/Foundation.h>
    #import "Status.h"
    
    int main(int argc, const char * argv[]) {
        /*
         模拟场景:
         * 老王在2010-1-1 17:56:34注册了一个账号
         (名称:xiaomage@520it.com, 密码:haomage)
         * 老王的生日是1986-3-8 18:18:18
         * 老王发布一条说说
         * 文字内容  @“爆米花手机比逼格更有逼格”
         * 图片 @“phone.png”
         * 发表时间: 2015-6-20 10:23:23
         * 作者: 老王
         * 被转发的说说: 没有
         * 评论数: 100
         * 转发数: 90
         * 点赞数: 200
         
         * 王大锤在2012-8-8 19:26:54注册了一个账号
         (名称:dachuimeimei@520it.com, 密码:654321)
         
         * 王大锤的生日是1989-9-6 14:16:28
         
         * 王大锤在2015-6-21 20:47:09时,转发了老王之前发布的说说, 并且还附带了一句话:@“真的很有逼格”
         */
        
        /*
         至少应该有三个类:
         账号类(Account):
           注册的时间(registerTime)
           账号(email)
           密码(pwd)
         用户类(Author):
           用户昵称(name)
           用户头像(icon)
           用户是否是会员(vip)
           用户对应的账号(account)
           用户的生日(birthday)
         微博类(Status):
           微博正文(text)
           微博配图(picture)
           微博发布的时间(createTime)
           微博对应的作者(用户)(author)
           评论数(commentCount)
           转发数(retweetCount)
           赞数(likeCount)
           转发微博(repostStatus)
         微博中有用户, 用户中有账号
         1.账号 2.用户 3.微博
        */
        
        // 1.给老王创建账号
        Account *lwAccount = [[Account alloc] init];
        lwAccount.email = @"xiaomage@520it.com";
        lwAccount.pwd = @"haomage";
        lwAccount.registerTime = (MyDate){2010, 1, 1, 17, 56, 34};
        
        // 2.根据账号设置用户信息
        Author *lwAuthor = [[Author alloc] init];
        lwAuthor.name = @"老王";
        lwAuthor.icon = @"lw.png";
        lwAuthor.vip = YES;
        lwAuthor.account = lwAccount;
        lwAuthor.birthday = (MyDate){1986, 3, 8, 18, 18, 18};
        
        // 3.发布微博
        Status *lwStatus = [[Status alloc] init];
        lwStatus.text = @"爆米花手机比逼格更有逼格";
        lwStatus.picture = @"phone.png";
        lwStatus.createTime = (MyDate){2015, 6, 20, 10, 23, 23};
        lwStatus.author = lwAuthor;
        lwStatus.commentCount = 100;
        lwStatus.retweetCount = 90;
        lwStatus.likeCount = 200;
        
        // 1.给王大锤创建账号
        Account *dcAccount = [[Account alloc] init];
        dcAccount.email = @"dachuimeimei@520it.com";
        dcAccount.pwd = @"654321";
        dcAccount.registerTime = (MyDate){2012, 8, 8, 19, 26, 54};
        
        // 2.根据账号设置用户信息
        Author *dcAuthor = [[Author alloc] init];
        dcAuthor.name = @"王大锤";
        dcAuthor.icon = @"wdc.png";
        dcAuthor.vip = NO;
        dcAuthor.account = dcAccount;
        dcAuthor.birthday = (MyDate){1989, 9, 6, 14, 16, 28};
    
        // 3.发布微博
        Status *dcStatus = [[Status alloc] init];
        dcStatus.text = @"真的很有逼格";
        dcStatus.picture = nil;
        dcStatus.createTime = (MyDate){2015, 6, 21, 20, 47, 9};
        dcStatus.author = dcAuthor;
        dcStatus.commentCount = 0;
        dcStatus.retweetCount = 0;
        dcStatus.likeCount = 0;
        dcStatus.repostStatus = lwStatus;
        
        [lwAccount release];
        [lwAuthor release];
        [lwStatus release];
        
        [dcAccount release];
        [dcAuthor release];
        [dcStatus release];
        
        return 0;
    }
    //  Status.h
    
    #import <Foundation/Foundation.h>
    #import "Author.h"
    
    @interface Status : NSObject
    
    @property(nonatomic, retain)NSString *text;
    
    @property(nonatomic, retain)NSString *picture;
    
    @property(nonatomic, assign)MyDate createTime; //结构体诗基本数据类型
    
    @property(nonatomic, retain)Author *author;
    
    @property(nonatomic, assign)int commentCount;
    
    @property (nonatomic, assign) int retweetCount;
    
    @property(nonatomic, assign)int likeCount;
    
    @property(nonatomic, retain)Status *repostStatus;
    @end
    //
    //  Status.m
    
    #import "Status.h"
    
    @implementation Status
    
    - (void)dealloc
    {
        NSLog(@"%s", __func__);
        
        /*
        [_text release];
        _text = nil;    //释放完了之后要致为空
        
        [_picture release];
        _picture = nil;
        
        [_author release];
        _author = nil;
        
        [_repostStatus release];
        _repostStatus = nil;
         */
        
        // 由于加了retain,下面点语法相当于调用了set方法:先release旧值, 然后再将新值赋值给属性
        self.text = nil;
        self.picture = nil;
        self.author = nil;
        self.repostStatus = nil;
        
        [super dealloc];
    }
    
    /*
     self.text = nil:
     - (void)setText:(NSString *)text // nil
     {
     // 加入上一次的值是@"abc";
     
     if (_text != text) {
     [_text release];//release旧值
     _text = [text retain]; // 新值加1后赋值过来,_text = nil;
     }
     }*/
    
    @end
    //
    //  Author.h
    
    #import <Foundation/Foundation.h>
    #import "Account.h"
    
    @interface Author : NSObject
    
    @property(nonatomic, retain)NSString *name;
    
    @property(nonatomic, retain)NSString *icon;
    
    @property(nonatomic, assign, getter=isVip)BOOL vip;
    
    @property(nonatomic, retain)Account *account;
    
    @property(nonatomic, assign)MyDate birthday;
    @end
    //
    //  Author.m
    
    #import "Author.h"
    
    @implementation Author
    
    - (void)dealloc
    {
        NSLog(@"%s", __func__);
        [_name release];
        [_icon release];
        [_account release];
        [super dealloc];
    }
    @end
    //  Account.h
    
    #import <Foundation/Foundation.h>
    
    typedef struct{
        int year;
        int month;
        int day;
        int hour;
        int minute;
        int second;
    } MyDate;
    @interface Account : NSObject
    
    @property(nonatomic, assign)MyDate registerTime;
    
    @property(nonatomic, retain)NSString *email; // copy
    
    @property(nonatomic, retain)NSString *pwd;
    @end
    //
    //  Account.m
    
    
    #import "Account.h"
    
    @implementation Account
    
    -(void)dealloc
    {
        NSLog(@"%s", __func__);
        [_email release];
        [_pwd release];
        [super dealloc];
    }
    @end
  • 相关阅读:
    CAS配置记录
    线程同步机制
    线程
    异常
    List集合
    数据结构
    泛型+通配符高级使用--受限泛型
    Collection集合+迭代器+foreach循环
    easyui获取日期datebox中的值
    EL表达式与三目运算符
  • 原文地址:https://www.cnblogs.com/yaowen/p/7428050.html
Copyright © 2011-2022 走看看