文章部分出于自己的理解,有不對(duì)的地方,希望大家指正。

在光山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都全網(wǎng)營(yíng)銷,成都外貿(mào)網(wǎng)站制作,光山網(wǎng)站建設(shè)費(fèi)用合理。
實(shí)例對(duì)象我們可以看作是一個(gè)指針,實(shí)例對(duì)象通過(guò)isa指針指向類對(duì)象,類對(duì)象通過(guò)isa指針指向元類對(duì)象,類對(duì)象和元類對(duì)象本身其實(shí)都是objc_class結(jié)構(gòu)體,里面存放著我們需要的方法列表等。
那么當(dāng)我們方法調(diào)用的時(shí)候,方法是如何緩存的呢?
當(dāng)我們方法調(diào)用的時(shí)候,首先通過(guò)isa指針找到類對(duì)象,然后在類對(duì)象的方法列表里面查找相對(duì)應(yīng)的方法,找到以后會(huì)加入到我們方法緩存里面,等下次我們?cè)僬{(diào)用的時(shí)候,首先會(huì)先從緩存里面去查找相關(guān)方法,更加的效率。
那如果我們調(diào)用的是父類里面的方法呢,其實(shí)父類對(duì)象里面的方法是不可以緩存到子類方法緩存列表里面的,所以,當(dāng)我們調(diào)用的是父類對(duì)象里面的方法的時(shí)候,其方法不會(huì)在子類對(duì)象方法緩存列表里面進(jìn)行緩存。
元類對(duì)象的相關(guān)緩存同類對(duì)象。
至于緩存擴(kuò)容和具體的緩存策略:
在arm64結(jié)構(gòu),也就是真機(jī)環(huán)境下,剛開始初始化的緩存方法的容器的長(zhǎng)度2,當(dāng)容器的長(zhǎng)度小于8時(shí),是滿容量了才擴(kuò)容。當(dāng)容器的長(zhǎng)度大于8時(shí),是7/8擴(kuò)容。也就是說(shuō)當(dāng)容器的長(zhǎng)度為8時(shí),容器可以存儲(chǔ)8個(gè)方法。當(dāng)容器的長(zhǎng)度為16時(shí),當(dāng)?shù)?5個(gè)方法需要存儲(chǔ)進(jìn)來(lái)的時(shí)候,容器就要擴(kuò)容了。
在x86_64架構(gòu)下,剛開始初始化的容器的長(zhǎng)度為4,是3/4擴(kuò)容。這里的3/4擴(kuò)容指的是:如果容器的長(zhǎng)度為4,當(dāng)?shù)?個(gè)數(shù)據(jù)需要存儲(chǔ)的時(shí)候,就要擴(kuò)容了。如果容器的長(zhǎng)度為8,當(dāng)?shù)?個(gè)數(shù)據(jù)需要存儲(chǔ)的時(shí)候,就要擴(kuò)容了。也就是說(shuō)容器只能存儲(chǔ)容器長(zhǎng)度的3/4減1個(gè)方法。
還有一點(diǎn)就是:當(dāng)容器擴(kuò)容之后,前面存儲(chǔ)的方法也會(huì)隨之清空。
參考鏈接:
iOS本地?cái)?shù)據(jù)保存有多種方式,歸納如下:
本章不僅是學(xué)習(xí)多種數(shù)據(jù)存儲(chǔ)方式,也可學(xué)習(xí)到其他知識(shí)點(diǎn),下面就讓我們?cè)敿?xì)來(lái)看:
具體方法為:
第一步:獲得文件即將保存的路徑,并生成在該路徑下的文件:
第二步:往文件中寫入/讀取:
方法一:
方法二:
方法三:
2.NSUserDefaults:是一個(gè)單例對(duì)象,在整個(gè)應(yīng)用程序的生命周期中都只有一個(gè)實(shí)例。用來(lái)保存應(yīng)用程序設(shè)置和屬性、用戶保存的數(shù)據(jù)。存儲(chǔ)在沙盒的Library/Preference中,NSUserDefaults可以存儲(chǔ)的數(shù)據(jù)類型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。寫入和讀取都比較簡(jiǎn)單,如下:
寫入:
NSString *str = [userDefault objectForKey:@"zhigang"];
@interface Person : NSObject NSCoding//遵守NSCoding協(xié)議
@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) NSInteger age;
@end
解檔操作:
同樣調(diào)用NSCoder子類NSKeyedArchiver的方法unarchiveRootObject:toFile: 即可
[NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archiver encodeObject:person forKey:@"person"];
[archiver encodeObject:bir forKey:@"bir"];
// 存檔完畢(一定要調(diào)用這個(gè)方法)
[archiver finishEncoding];
[data writeToFile:path atomically:YES];
NSData *undata = [NSData dataWithContentsOfFile:path];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
[unarchiver decodeObjectForKey:@"person"];
[unarchiver decodeObjectForKey:@"bir"];
// 恢復(fù)完畢
[unarchiver finishDecoding];
方法一:一般將服務(wù)器第一次返回的數(shù)據(jù)保存在沙盒里面。這樣在手機(jī)斷網(wǎng)的情況下可以從本地讀取數(shù)據(jù)了。
1.保存到沙盒的代碼:
[plain] view
plaincopy
+ (void)saveCache:(int)type andID:(int)_id andString:(NSString *)str;
{
NSUserDefaults * setting = [NSUserDefaults standardUserDefaults];
NSString * key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];
[setting setObject:str forKey:key];
[setting synchronize];
}
2.讀取本地沙盒的代碼
讀取之前首先根據(jù)type和Id判斷本地是否有
[plain] view
plaincopy
+ (NSString *)getCache:(int)type andID:(int)_id
{
NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
NSString *key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];
NSString *value = [settings objectForKey:key];
return value;
}
如果沙盒里面有數(shù)據(jù)
[plain] view
plaincopy
NSString *value = [Tool getCache:5 andID:self.QiuTime];
if (value) {
NSDictionary *backdict = [value JSONValue];
if ([backdict objectForKey:@"items"]) {
NSArray *array=[NSArray arrayWithArray:[backdict objectForKey:@"items"]];
for (NSDictionary *qiushi in array) {
QiuShi *qs=[[[QiuShi alloc]initWithDictionary:qiushi] autorelease];
[self.list addObject:qs];
}
}
[self.tableView reloadData];
}
[self.tableView tableViewDidFinishedLoadingWithMessage:@"數(shù)據(jù)全部加載完了.."];
self.tableView.reachedTheEnd = YES;
方法二:使用ASIHTTPRequest和ASIDownloadCache實(shí)現(xiàn)本地緩存
1、設(shè)置全局的Cache
在AppDelegate.h中添加一個(gè)全局變量
[plain] view plaincopy
@interface AppDelegate : UIResponder
{
ASIDownloadCache *myCache;
}
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic,retain) ASIDownloadCache *myCache;
在AppDelegate.m中的- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代碼
[plain] view plaincopy
//自定義緩存
ASIDownloadCache *cache = [[ASIDownloadCache alloc] init];
self.myCache = cache;
[cache release];
//設(shè)置緩存路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
[self.myCache setStoragePath:[documentDirectory stringByAppendingPathComponent:@"resource"]];
[self.myCache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
在AppDelegate.m中的dealloc方法中添加如下語(yǔ)句
[plain] view plaincopy
[myCache release];
到這里為止,就完成了全局變量的聲明。
2、設(shè)置緩存策略
在實(shí)現(xiàn)ASIHTTPRequest請(qǐng)求的地方設(shè)置request的存儲(chǔ)方式,代碼如下
[plain] view plaincopy
NSString *str = @"";
NSURL *url = [NSURL URLWithString:str];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
//獲取全局變量
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
//設(shè)置緩存方式
[request setDownloadCache:appDelegate.myCache];
//設(shè)置緩存數(shù)據(jù)存儲(chǔ)策略,這里采取的是如果無(wú)更新或無(wú)法聯(lián)網(wǎng)就讀取緩存數(shù)據(jù)
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
request.delegate = self;
[request startAsynchronous];
3、清理緩存數(shù)據(jù)
我在這里采用的是手動(dòng)清理數(shù)據(jù)的方式,在適當(dāng)?shù)牡胤教砑尤缦麓a,我將清理緩存放在了應(yīng)用的設(shè)置模塊:
[plain] view plaincopy
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate.myCache clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
這里清理的是ASICachePermanentlyCacheStoragePolicy這種存儲(chǔ)策略的緩存數(shù)據(jù),如果更換其他的參數(shù)的話,即可清理對(duì)應(yīng)存儲(chǔ)策略的緩存數(shù)據(jù)。
NSCache是蘋果系統(tǒng)提供的一個(gè)緩存框架,用法和NSMutableDictionary 相似。都是通過(guò)setValue: forKey: 設(shè)置值、和objectForKey 取值,
但還是有區(qū)別:
設(shè)置代理
需要類遵守協(xié)議NSCacheDelegate
把數(shù)據(jù)寫入NSCache緩存
讀取內(nèi)存緩存NSCache
刪除 NSCache數(shù)據(jù)
代理方法
即將回收清理cache的時(shí)候調(diào)用改方法
1.獲取根目錄
let homePath = NSHomeDirectory()
2.獲取其他目錄
獲取沙盒目錄路徑可以通過(guò) NSSearchPathForDirectoriesInDomains 方法,該方法有三個(gè)數(shù):
如果實(shí)現(xiàn)接口數(shù)據(jù)沒(méi)有變化使用緩存的功能?
拿到本地?cái)?shù)據(jù)摘要傳給后臺(tái),后臺(tái)判斷數(shù)據(jù)是否發(fā)生了變化,如果沒(méi)有變化就不給返回這個(gè)接口的大量數(shù)據(jù),如果發(fā)生了變化就返回這個(gè)接口的大量數(shù)據(jù)。
網(wǎng)站名稱:ios開發(fā)數(shù)據(jù)緩存,ios開發(fā)cache緩存機(jī)制
網(wǎng)址分享:http://chinadenli.net/article5/dsiigii.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、軟件開發(fā)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、品牌網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)