iOS中NSCache緩存機(jī)制

應(yīng)用場(chǎng)景:

iOS中需要頻繁讀取的數(shù)據(jù)剪芥,都可以用NSCache把數(shù)據(jù)緩存到內(nèi)存中提高讀取性能雇锡。

正文:

一:定義

  • NSCache是系統(tǒng)提供的一種類似于集合(NSMutableDictionary)的緩存蔚龙,它與集合的不同如下:
  1. NSCache具有自動(dòng)刪除的功能蔓榄,以減少系統(tǒng)占用的內(nèi)存;
  2. NSCache是線程安全的鞠值,不需要加線程鎖墓赴;
  3. 鍵對(duì)象不會(huì)像 NSMutableDictionary 中那樣被復(fù)制竞膳。(鍵不需要實(shí)現(xiàn) NSCopying 協(xié)議)。

二:屬性介紹

NSCache的屬性以及方法介紹:
@property NSUInteger totalCostLimit;
設(shè)置緩存占用的內(nèi)存大小诫硕,并不是一個(gè)嚴(yán)格的限制坦辟,當(dāng)總數(shù)超過(guò)了totalCostLimit設(shè)定的值,系統(tǒng)會(huì)清除一部分緩存章办,直至總消耗低于totalCostLimit的值锉走。
@property NSUInteger countLimit;
設(shè)置緩存對(duì)象的大小,這也不是一個(gè)嚴(yán)格的限制藕届。

- (id)objectForKey:(id)key;
獲取緩存對(duì)象挪蹭,基于key-value對(duì)
- (void)setObject:(id)obj forKey:(id)key; // 0 cost
存儲(chǔ)緩存對(duì)象,考慮緩存的限制屬性休偶;
- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;
存儲(chǔ)緩存對(duì)象梁厉,cost是提前知道該緩存對(duì)象占用的字節(jié)數(shù),也會(huì)考慮緩存的限制屬性椅贱,建議直接使用  - (void)setObject:(id)obj forKey:(id)key;
NSCacheDelegate代理

三:代理屬性聲明如下

@property (assign) id<NSCacheDelegate>delegate;
實(shí)現(xiàn)了NSCacheDelegate代理的對(duì)象懂算,在緩存對(duì)象即將被清理的時(shí)候只冻,系統(tǒng)回調(diào)代理方法如下:
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;
第一個(gè)參數(shù)是當(dāng)前緩存(NSCache)庇麦,不要修改該對(duì)象;
第二個(gè)參數(shù)是當(dāng)前將要被清理的對(duì)象喜德,如果需要存儲(chǔ)該對(duì)象山橄,可以在此操作(存入Sqlite or CoreData);
該代理方法的調(diào)用會(huì)在緩存對(duì)象即將被清理的時(shí)候調(diào)用,如下場(chǎng)景會(huì)調(diào)用:

1. - (void)removeObjectForKey:(id)key; 手動(dòng)刪除對(duì)象舍悯;
2. 緩存對(duì)象超過(guò)了NSCache的屬性限制航棱;(countLimit 和 totalCostLimit )
3. App進(jìn)入后臺(tái)會(huì)調(diào)用;
4. 系統(tǒng)發(fā)出內(nèi)存警告萌衬;

四:NSDiscardableContent協(xié)議

NSDiscardableContent是一個(gè)協(xié)議饮醇,實(shí)現(xiàn)這個(gè)協(xié)議的目的是為了讓我們的對(duì)象在不被使用時(shí),可以將其丟棄秕豫,以讓程序占用更少的內(nèi)存朴艰。
一個(gè)NSDiscardableContent對(duì)象的生命周期依賴于一個(gè)“counter”變量观蓄。一個(gè)NSDiscardableContent對(duì)象實(shí)際是一個(gè)可清理內(nèi)存塊,這個(gè)內(nèi)存記錄了對(duì)象當(dāng)前是否被其它對(duì)象使用祠墅。如果這塊內(nèi)存正在被讀取侮穿,或者仍然被需要,則它的counter變量是大于或等于1的毁嗦;當(dāng)它不再被使用時(shí)亲茅,就可以丟棄,此時(shí)counter變量將等于0狗准。當(dāng)counter變量等于0時(shí)克锣,如果當(dāng)前時(shí)間點(diǎn)內(nèi)存比較緊張的話,內(nèi)存塊就可能被丟棄驶俊。這點(diǎn)類似于MRC&ARC娶耍,對(duì)象內(nèi)存回收機(jī)制。

- (void)discardContentIfPossible
當(dāng)counter等于0的時(shí)候饼酿,為了丟棄這些對(duì)象榕酒,會(huì)調(diào)用這個(gè)方法。
默認(rèn)情況下故俐,NSDiscardableContent對(duì)象的counter變量初始值為1想鹰,以確保對(duì)象不會(huì)被內(nèi)存管理系統(tǒng)立即釋放。
- (BOOL)beginContentAccess    (counter++)
調(diào)用該方法药版,對(duì)象的counter會(huì)加1辑舷;
與beginContentAccess相對(duì)應(yīng)的是endContentAccess。如果可丟棄內(nèi)存不再被訪問(wèn)時(shí)調(diào)用槽片。其聲明如下:
- (void)endContentAccess  (counter--)
該方法會(huì)減少對(duì)象的counter變量何缓,通常是讓對(duì)象的counter值變回為0,這樣在對(duì)象的內(nèi)容不再被需要時(shí)还栓,就要以將其丟棄碌廓。
NSCache類提供了一個(gè)屬性,來(lái)標(biāo)識(shí)緩存是否自動(dòng)舍棄那些內(nèi)存已經(jīng)被丟棄的對(duì)象(默認(rèn)該屬性為YES)剩盒,其聲明如下:
@property BOOL evictsObjectsWithDiscardedContent
如果設(shè)置為YES谷婆,則在對(duì)象的內(nèi)存被丟棄時(shí)舍棄對(duì)象。
個(gè)人建議:如果需要使用緩存辽聊,直接用系統(tǒng)的NSCache就OK了纪挎,不要做死。
NSCache就寫到這里了跟匆,歡迎大家來(lái)指正錯(cuò)誤异袄,我們一起進(jìn)步,感謝大家的閱讀玛臂。

使用場(chǎng)景

一: 緩存數(shù)量限制代碼示例

代碼演練

需要實(shí)現(xiàn)NSCacheDelegate
@interface ViewController () <NSCacheDelegate>
實(shí)現(xiàn)代理方法:
// MARK: NSCache Delegate
// 當(dāng)緩存中的對(duì)象被清除的時(shí)候烤蜕,會(huì)自動(dòng)調(diào)用
// obj 就是要被清理的對(duì)象
// 提示:不建議平時(shí)開(kāi)發(fā)時(shí)重寫埠帕!僅供調(diào)試使用
- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
    [NSThread sleepForTimeInterval:0.5];
    NSLog(@"清除了-------> %@", obj);
}
聲明NSCache變量:
@property (nonatomic, strong) NSCache *cache;
懶加載:
- (NSCache *)cache {
    if (_cache == nil) {
        _cache = [[NSCache alloc] init];
        // 設(shè)置數(shù)量限制,最大限制為10
        _cache.countLimit = 10;
        _cache.delegate = self;
    }
    return _cache;
}
測(cè)試Demo:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (int i = 0; i < 20; ++i) {
        NSString *str = [NSString stringWithFormat:@"hello - %04d", i];

        NSLog(@"設(shè)置 %@", str);
        // 添加到緩存
        [self.cache setObject:str forKey:@(i)];
    }

    // - 查看緩存內(nèi)容,NSCache 沒(méi)有提供遍歷的方法玖绿,只支持用 key 來(lái)取值
    for (int i = 0; i < 20; ++i) {
        NSLog(@"緩存中----->%@", [self.cache objectForKey:@(i)]);
    }
}

運(yùn)行結(jié)果:
2015-03-25 09:27:19.953 01-NSCache演練[26010:681046] 設(shè)置 hello - 0000
2015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設(shè)置 hello - 0001
2015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設(shè)置 hello - 0002
2015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設(shè)置 hello - 0003
2015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設(shè)置 hello - 0004
2015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設(shè)置 hello - 0005
2015-03-25 09:27:19.954 01-NSCache演練[26010:681046] 設(shè)置 hello - 0006
2015-03-25 09:27:19.955 01-NSCache演練[26010:681046] 設(shè)置 hello - 0007
2015-03-25 09:27:19.955 01-NSCache演練[26010:681046] 設(shè)置 hello - 0008
2015-03-25 09:27:19.955 01-NSCache演練[26010:681046] 設(shè)置 hello - 0009
2015-03-25 09:27:19.955 01-NSCache演練[26010:681046] 設(shè)置 hello - 0010
2015-03-25 09:27:20.456 01-NSCache演練[26010:681046] 清除了-------> hello - 0000
2015-03-25 09:27:20.457 01-NSCache演練[26010:681046] 設(shè)置 hello - 0011
2015-03-25 09:27:20.957 01-NSCache演練[26010:681046] 清除了-------> hello - 0001
2015-03-25 09:27:20.957 01-NSCache演練[26010:681046] 設(shè)置 hello - 0012
2015-03-25 09:27:21.458 01-NSCache演練[26010:681046] 清除了-------> hello - 0002
2015-03-25 09:27:21.459 01-NSCache演練[26010:681046] 設(shè)置 hello - 0013
2015-03-25 09:27:21.959 01-NSCache演練[26010:681046] 清除了-------> hello - 0003
2015-03-25 09:27:21.959 01-NSCache演練[26010:681046] 設(shè)置 hello - 0014
2015-03-25 09:27:22.461 01-NSCache演練[26010:681046] 清除了-------> hello - 0004
2015-03-25 09:27:22.461 01-NSCache演練[26010:681046] 設(shè)置 hello - 0015
2015-03-25 09:27:22.962 01-NSCache演練[26010:681046] 清除了-------> hello - 0005
2015-03-25 09:27:22.962 01-NSCache演練[26010:681046] 設(shè)置 hello - 0016
2015-03-25 09:27:23.464 01-NSCache演練[26010:681046] 清除了-------> hello - 0006
2015-03-25 09:27:23.464 01-NSCache演練[26010:681046] 設(shè)置 hello - 0017
2015-03-25 09:27:23.965 01-NSCache演練[26010:681046] 清除了-------> hello - 0007
2015-03-25 09:27:23.965 01-NSCache演練[26010:681046] 設(shè)置 hello - 0018
2015-03-25 09:27:24.466 01-NSCache演練[26010:681046] 清除了-------> hello - 0008
2015-03-25 09:27:24.466 01-NSCache演練[26010:681046] 設(shè)置 hello - 0019
2015-03-25 09:27:24.967 01-NSCache演練[26010:681046] 清除了-------> hello - 0009
2015-03-25 09:27:24.967 01-NSCache演練[26010:681046] 緩存中----->(null)
2015-03-25 09:27:24.967 01-NSCache演練[26010:681046] 緩存中----->(null)
2015-03-25 09:27:24.968 01-NSCache演練[26010:681046] 緩存中----->(null)
2015-03-25 09:27:24.968 01-NSCache演練[26010:681046] 緩存中----->(null)
2015-03-25 09:27:24.968 01-NSCache演練[26010:681046] 緩存中----->(null)
2015-03-25 09:27:24.968 01-NSCache演練[26010:681046] 緩存中----->(null)
2015-03-25 09:27:24.969 01-NSCache演練[26010:681046] 緩存中----->(null)
2015-03-25 09:27:24.969 01-NSCache演練[26010:681046] 緩存中----->(null)
2015-03-25 09:27:24.969 01-NSCache演練[26010:681046] 緩存中----->(null)
2015-03-25 09:27:24.969 01-NSCache演練[26010:681046] 緩存中----->(null)
2015-03-25 09:27:24.969 01-NSCache演練[26010:681046] 緩存中----->hello - 0010
2015-03-25 09:27:24.970 01-NSCache演練[26010:681046] 緩存中----->hello - 0011
2015-03-25 09:27:24.970 01-NSCache演練[26010:681046] 緩存中----->hello - 0012
2015-03-25 09:27:24.970 01-NSCache演練[26010:681046] 緩存中----->hello - 0013
2015-03-25 09:27:24.970 01-NSCache演練[26010:681046] 緩存中----->hello - 0014
2015-03-25 09:27:24.971 01-NSCache演練[26010:681046] 緩存中----->hello - 0015
2015-03-25 09:27:24.971 01-NSCache演練[26010:681046] 緩存中----->hello - 0016
2015-03-25 09:27:24.971 01-NSCache演練[26010:681046] 緩存中----->hello - 0017
2015-03-25 09:27:24.971 01-NSCache演練[26010:681046] 緩存中----->hello - 0018
2015-03-25 09:27:24.971 01-NSCache演練[26010:681046] 緩存中----->hello - 0019

總結(jié)
通過(guò)打印結(jié)果可以知道敛瓷,當(dāng)超多最大成本限制的時(shí)候,會(huì)先清除緩存中的一條數(shù)據(jù)斑匪,再存入一條新的數(shù)據(jù)呐籽。最后緩存中只能保存最大成本數(shù)的數(shù)據(jù),即10條蚀瘸。

二:關(guān)聯(lián)沙箱代碼示例:(減少頻繁讀取文件時(shí)間)

代碼示例

#import "AHPersonInfoManager.h"
#import "YYModel.h"
@interface AHPersonInfoManager()
//用戶信息模型
@property(nonatomic,strong)AHPersonInfoModel *model;
//個(gè)人信息緩存
@property(nonatomic,strong)NSCache *infoModelCache;

@end

@implementation AHPersonInfoManager

+(instancetype)manager{
    static AHPersonInfoManager *personInfoManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        @synchronized (personInfoManager) {
            personInfoManager = [[AHPersonInfoManager alloc]init];
            personInfoManager.infoModelCache = [[NSCache alloc]init];
        }
       
    });
    return personInfoManager;
}

#pragma mark 個(gè)人資料

-(AHPersonInfoModel*)getInfoModel{
    //讀取緩存
    if (_infoModelCache) {
        return [_infoModelCache objectForKey:@"infoModel"];
    }
    //讀取文件
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //獲取完整路徑
    NSString *documentsDirectory = [paths objectAtIndex:0];
//    LOG(@"homeDirectory = %@", documentsDirectory);
    NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:PersonInfoFilePath];
    //讀出文件
    if (  [[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
        NSMutableDictionary *infoDic = [[[NSMutableDictionary alloc] initWithContentsOfFile:plistPath] mutableCopy];
        _model = [AHPersonInfoModel yy_modelWithDictionary:infoDic];
    }else{
        //防nil
        _model = [[AHPersonInfoModel alloc]init];
    }
    //寫入緩存
    [_infoModelCache setObject:_model forKey:@"infoModel"];
    return _model;
}

-(void)setInfoModel:(AHPersonInfoModel*)infoModel{
    @synchronized (self) {
        //寫入緩存
        if (!_infoModelCache) {
            _infoModelCache = [[NSCache alloc]init];
        }
        [_infoModelCache setObject:infoModel forKey:@"infoModel"];
        //寫入文件
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        //獲取完整路徑
        NSString *documentsDirectory = [paths objectAtIndex:0];
        //    LOG(@"homeDirectory = %@", documentsDirectory);
        NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:PersonInfoFilePath];
        NSDictionary *dic = [infoModel yy_modelToJSONObject];
        //寫入文件
        [dic writeToFile:plistPath atomically:YES];
        _model = infoModel;
    }

}

-(void)setWithJson:(id)json{
    @synchronized (self) {
        NSMutableDictionary *newInfoDic = [json yy_modelToJSONObject];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        //獲取完整路徑
        NSString *documentsDirectory = [paths objectAtIndex:0];
        //    LOG(@"homeDirectory = %@", documentsDirectory);
        NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:PersonInfoFilePath];
        //原模型字典
        NSMutableDictionary *oldInfoDic= [[[NSMutableDictionary alloc] initWithContentsOfFile:plistPath] mutableCopy];
        //防nil
        if (!([oldInfoDic allKeys].count >0)) {
            oldInfoDic = [NSMutableDictionary dictionary];
        }
        
        //修改對(duì)應(yīng)的key-value
        NSArray *keyArray  = [newInfoDic allKeys];
        if (keyArray.count>0) {
            for (NSString *key in keyArray) {
                if (  [newInfoDic objectForKey:key]) {
                    //去除星座
                    if ([key isEqualToString:@"constellation"]) {
                        
                    }else{
                        [oldInfoDic setObject:newInfoDic[key] forKey:key];
                    }
                    
                }
            }
            [oldInfoDic writeToFile:plistPath atomically:YES];
            //寫入緩存
            if (!_infoModelCache) {
                _infoModelCache = [[NSCache alloc]init];
            }
            AHPersonInfoModel *infoModel = [AHPersonInfoModel yy_modelWithJSON:oldInfoDic];
            [_infoModelCache setObject:infoModel forKey:@"infoModel"];
       
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狡蝶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贮勃,更是在濱河造成了極大的恐慌贪惹,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寂嘉,死亡現(xiàn)場(chǎng)離奇詭異奏瞬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)泉孩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門硼端,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寓搬,你說(shuō)我怎么就攤上這事珍昨。” “怎么了句喷?”我有些...
    開(kāi)封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵镣典,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我唾琼,道長(zhǎng)兄春,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任父叙,我火速辦了婚禮神郊,結(jié)果婚禮上肴裙,老公的妹妹穿的比我還像新娘趾唱。我一直安慰自己,他們只是感情好蜻懦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布甜癞。 她就那樣靜靜地躺著,像睡著了一般宛乃。 火紅的嫁衣襯著肌膚如雪悠咱。 梳的紋絲不亂的頭發(fā)上蒸辆,一...
    開(kāi)封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音析既,去河邊找鬼躬贡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛眼坏,可吹牛的內(nèi)容都是我干的拂玻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宰译,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼檐蚜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起沿侈,我...
    開(kāi)封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闯第,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后缀拭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咳短,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年蛛淋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诲泌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铣鹏,死狀恐怖敷扫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诚卸,我是刑警寧澤葵第,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站合溺,受9級(jí)特大地震影響卒密,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棠赛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一哮奇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睛约,春花似錦鼎俘、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至怔揩,卻和暖如春捉邢,著一層夾襖步出監(jiān)牢的瞬間脯丝,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工伏伐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宠进,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓藐翎,卻偏偏與公主長(zhǎng)得像砰苍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阱高,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 今天研究SDWebimage發(fā)現(xiàn),里面使用了NSCache的一個(gè)方法setObject:forKey:cost:首...
    RealSlimAlan閱讀 2,368評(píng)論 1 6
  • 曾經(jīng)有一份美好的愛(ài)情放在我的面前我沒(méi)有珍惜。等到失去后才后悔莫及未舟。如果可以再對(duì)小李說(shuō)圈暗。毛欣想說(shuō)。這輩子無(wú)緣再牽手裕膀。...
    毛欣與小李閱讀 2,622評(píng)論 0 13
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理员串,服務(wù)發(fā)現(xiàn),斷路器昼扛,智...
    卡卡羅2017閱讀 134,702評(píng)論 18 139
  • 冬日的雨與不絕的寒冷寸齐, 充斥在我枯萎的日記里。 字字句句都烙印著想你抄谐, 一顆顆紅豆連綴成渺鹦, 一遍遍念你的名字。 煙...
    雪嶼閱讀 197評(píng)論 0 0
  • 電腦死機(jī)需要重啟蛹含,生活也一樣毅厚。 這是開(kāi)啟“21天寫作”的第一天,也是下半年開(kāi)始的第一天浦箱。今天估計(jì)微博及一些公眾號(hào)主...
    MikaGO閱讀 318評(píng)論 1 0