- 不要等到明天碾褂,明天太遙遠正塌,今天就行動乓诽。
須讀:看完該文章你能做什么鸠天?
能夠管理好多個類之間的內(nèi)存管理帐姻,學習一些逼格的代碼
學習前:你必須會什么?(在這里我已經(jīng)默認你具備C語言的基礎(chǔ)了)
什么是類,
怎么實現(xiàn)setter/getter方法(內(nèi)存管理下).
@property關(guān)鍵字的修飾符的<內(nèi)部實現(xiàn)>是如何處理setter/getter方法的
一剥纷、本章筆記
一扛伍、
在dealloc里面寫上self.text = nil;
相當于
// 給nil發(fā)送 retain release消息是不會報錯
- (void)setText:(NSString *)text // nil
{
//假如上一次的值 @"abc"
//傳進來的值 是 nil
if (_text != text) { // abc !=nil
[_text release]; // [_abc release];
_text = [text retain]; // _text = [nil retain];
}
}
二鳖宾、code
main.m
#pragma mark 09-多個對象內(nèi)存管理練習實現(xiàn)
#pragma mark 概念
/*
一鼎文、
在dealloc里面寫上self.text = nil;
相當于
// 給nil發(fā)送 retain release消息是不會報錯
- (void)setText:(NSString *)text // nil
{
//假如上一次的值 @"abc"
//傳進來的值 是 nil
if (_text != text) { // abc !=nil
[_text release]; // [_abc release];
_text = [text retain]; // _text = [nil retain];
}
}
*/
#pragma mark - 代碼
#import <Foundation/Foundation.h>
#pragma mark 類
#import "Status.h"
#pragma mark - main函數(shù)
int main(int argc, const char * argv[])
{
/*
模擬場景:
* lyh 在 2012-1-1 22:30:44 注冊了一個賬號
(名稱: lyh@163.com 密碼:123456)
* lyh的生日 是 1992-12-12 23:22:44
* lyh 發(fā)布一條說說
* 文字內(nèi)容 @"學學 以色列"
* 圖片 @"test.png"
* 發(fā)表時間 : 2013-12-11 23:21:45
* 作者: lyh
* 被轉(zhuǎn)發(fā)的說說 : 沒有
* 評價數(shù) : 100
* 轉(zhuǎn)發(fā) : 33
* 點贊數(shù) : 222
* lys 在 2013-1-1 22:10:33 注冊了一個賬號
{名稱 : lys@163.com 密碼: 123456}
* lys 的生日1989 - 3 - 4 ,16: 14: 22
lys 早2015-6 13: 12 :44
lys 在 2015-12-23 20:44:23時, 換發(fā)了lyh之前發(fā)布的說說, 并且還附帶了一句話 @“會玩呀”
*/
#warning 分析 拆分類
/**
至少應(yīng)該有三個類:
賬號類(Account)
注冊的時間 (registerTime)
賬號 (email)
密碼 (pwd)
用戶類:(Author)
用戶的昵稱 (name)
用戶的頭像 (icon)
用戶的是否是會員 (vip)
用戶對應(yīng)的賬號 (account)
用戶的生日 (用來做營銷, 到生日的時候 提示或者送一些其他小禮物) (birthday)
微博類: (Status)
微博的正文 (text)
微博配圖 (pricture) (可能有一張周偎、多張蓉坎、高清蛉艾、中圖勿侯、小圖)(可以抽取為一個類)
微博的發(fā)布時間 (createTime)
微博對應(yīng)的作者(用戶)(author)
評論數(shù) (commoentCount)
轉(zhuǎn)發(fā)數(shù) (retweetCount)
贊數(shù) (likeCount)
轉(zhuǎn)發(fā)微博 (repostStatus)
微博中用戶, 用戶中有賬號
順序
1. 賬號 2.用戶 3.微博
*/
#pragma 1.
// 1.創(chuàng)建lyh賬號
Account *lyhAc = [[Account alloc]init];
lyhAc.email = @"lyh@163.com";
lyhAc.pwd = @"123456";
lyhAc.registerTime = (myDate){2012,1,1,22,30,44};
// 2.根據(jù)賬號設(shè)置用戶信息
Author *lyhAuthor = [[Author alloc]init];
lyhAuthor.name = @"lyh";
lyhAuthor.icon = @"lyh.png";
lyhAuthor.vip = YES;
lyhAuthor.account = lyhAc;
lyhAuthor.birthday = (myDate){1992,12,12,23,22,44};
// 3.發(fā)布微博
Status *lyhStatus = [[Status alloc]init];
lyhStatus.text = @"學學 以色列";
lyhStatus.pricture = @"test.png";
lyhStatus.createTime = (myDate){2013,12,11,23,21,45};
lyhStatus.author = lyhAuthor;
lyhStatus.commoentCount = 100;
lyhStatus.retweetCount = 33;
lyhStatus.likeCount = 222;
#pragma 1.
/*
lys 在 2013-1-1 22:10:33 注冊了一個賬號
{名稱 : lys@163.com 密碼: 123456}
* lys 的生日1989 - 3 - 4 ,16: 14: 22
lys 早2015-6 13: 12 :44
lys 在 2015-12-23 20:44:23時, 換發(fā)了lyh之前發(fā)布的說說, 并且還附帶了一句話 @“會玩呀”
*/
// 1.給lys創(chuàng)建賬號
Account *lysAc = [[Account alloc]init];
lysAc.email = @"lys@163.com";
lysAc.pwd = @"123456";
// 2.根據(jù)賬號設(shè)置用戶信息
Author *lysAuthor = [[Author alloc]init];
lysAuthor.name = @"lyh";
lysAuthor.icon = @"lyh.png";
lysAuthor.vip = NO;
lysAuthor.account = lysAc;
lysAuthor.birthday = (myDate){1989,3,4,16,14,22};
// 3.發(fā)布微博
Status *lysStatus = [[Status alloc]init];
lysStatus.text = @"會玩呀";
lysStatus.pricture = nil;
lysStatus.createTime = (myDate){2013,12,11,23,21,45};
lysStatus.author = lysAuthor;
lysStatus.commoentCount = 0;
lysStatus.retweetCount = 0;
lysStatus.likeCount = 0;
lysStatus.repostStatus = lyhStatus;
[lyhAc release];
[lyhAuthor release];
[lyhStatus release];
[lysAc release];
[lysAuthor release];
[lysStatus release];
return 0;
}
Account
>>>.h
#import <Foundation/Foundation.h>
typedef struct {
int yaer;
int month;
int day;
int hour;
int minute;
int second;
}myDate;
@interface Account : NSObject
/*
注冊的時間 (registerTime)
賬號 (email)
密碼 (pwd)
*/
@property (nonatomic,assign) myDate registerTime;
@property (nonatomic,retain) NSString *email;
@property (nonatomic,retain) NSString *pwd;
@end
>>>.m
#import "Account.h"
@implementation Account
- (void)dealloc
{
NSLog(@"%s",__func__);
[_email release];
[_pwd release];
[super dealloc];
}
@end
Author
>>>.h
#import <Foundation/Foundation.h>
#import "Account.h"
@interface Author : NSObject
/*
用戶的昵稱 (name)
用戶的頭像 (icon)
用戶的是否是會員 (vip)
用戶對應(yīng)的賬號 (account)
用戶的生日 (用來做營銷, 到生日的時候 提示或者送一些其他小禮物) (birthday)
*/
@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
>>>.m
#import "Author.h"
@implementation Author
- (void)dealloc
{
NSLog(@"%s",__func__);
[_name release];
[_icon release];
[_account release];
[super dealloc];
}
@end
Status
>>>.h
#import <Foundation/Foundation.h>
#import "Author.h"
@interface Status : NSObject
/*
微博類: (Status)
微博的正文 (text)
微博配圖 (pricture) (可能有一張、多張矢空、高清、中圖柏锄、小圖)(可以抽取為一個類)
微博的發(fā)布時間 (createTime)
微博對應(yīng)的作者(用戶)(author)
評論數(shù) (commoentCount)
轉(zhuǎn)發(fā)數(shù) (retweetCount)
贊數(shù) (likeCount)
轉(zhuǎn)發(fā)微博 (repostStatus)
*/
@property (nonatomic,retain) NSString *text;
@property (nonatomic,retain) NSString *pricture;
@property (nonatomic,assign) myDate createTime;
@property (nonatomic,retain) Author *author;
@property (nonatomic,assign) int commoentCount;
@property (nonatomic,assign) int retweetCount;
@property (nonatomic,assign) int likeCount;
@property (nonatomic,retain) Status *repostStatus;
@end
>>>.m
#import "Status.h"
@implementation Status
- (void)dealloc
{
NSLog(@"%s",__func__);
#warning 新手裝逼寫法
/*
[_text release];
_text = nil;
[_pricture release];
_pricture = nil;
[_author release];
_author = nil;
[_repostStatus release];
_repostStatus = nil;
*/
#warning 高手裝逼寫法
/*
下面這句話 相當于調(diào)用了set方法
先release 舊值, 然后再將新值 賦值給屬性
*/
self.text = nil;
self.pricture = nil;
self.author = nil;
self.repostStatus = nil;
/*
// 上面的 self.text = nil; 等同下面的
// 逼格
// 給nil發(fā)送 retain release消息是不會報錯
- (void)setText:(NSString *)text // nil
{
// 假如上一次的值 @"abc"
// 傳進來的值 是 nil
if (_text != text) {
[_text release];
_text = [text retain]; // _text = nil
}
}
*/
[super dealloc];
}
@end