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
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7428050.html,如需转载请自行联系原作者

相关文章
|
24天前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
35 3
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
114 4
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
90 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
Java 测试技术 Android开发
让星星⭐月亮告诉你,强软弱虚引用类型对象在内存足够和内存不足的情况下,面对System.gc()时,被回收情况如何?
本文介绍了Java中四种引用类型(强引用、软引用、弱引用、虚引用)的特点及行为,并通过示例代码展示了在内存充足和不足情况下这些引用类型的不同表现。文中提供了详细的测试方法和步骤,帮助理解不同引用类型在垃圾回收机制中的作用。测试环境为Eclipse + JDK1.8,需配置JVM运行参数以限制内存使用。
39 2
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
64 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
2月前
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
30 0
深入理解java对象的内存布局
|
2月前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(二)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
|
2月前
|
算法 Java
JVM进阶调优系列(3)堆内存的对象什么时候被回收?
堆对象的生命周期是咋样的?什么时候被回收,回收前又如何流转?具体又是被如何回收?今天重点讲对象GC,看完这篇就全都明白了。
|
2月前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(三)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
|
2月前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(一)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作

热门文章

最新文章