'寫在前面'
這些是我對iOS面試時(shí)會(huì)碰到的問題的解決方法,整理出來分享給大家,有些錯(cuò)誤不要
太好笑,希望對大家有所幫助。大家有更好的解決辦法也歡迎溝通交流。
一直以來都有寫點(diǎn)兒東西的想法,就從筆記、從閱讀開始吧,加油!'
對于剛?cè)ッ嬖嚨膇os開發(fā)的小白來說,就怕面試官的靈魂提問,代碼是敲不完的,bug也是改不完的,你只能漸漸去完善,所以面對面試官的技術(shù)提問,就應(yīng)更加完善的回答,下面我就對懶加載這個(gè)技術(shù)點(diǎn)簡單的給各位做下復(fù)習(xí)吧?。?br>
1.概念問題,什么是“懶加載”?
來些基礎(chǔ)性的書本知識性的概念吧?。。ㄎ抑滥憧催^書,但是呢!吾日三省吾身嘛?。〗又窗?.....)
所謂“懶加載”(Lazy loading) 也被叫作“延遲加載 ”,它的核心思想是把對象的實(shí)例化盡量延遲,直到真正用到的時(shí)候才將其實(shí)例化,這樣做的好處是可以減輕大量對象在實(shí)例化時(shí)對資源的消耗,而不是在程序初始化的時(shí)候就預(yù)先將對象實(shí)例化。另外,“懶加載”可以將對象的實(shí)例化代碼從初始化方法中獨(dú)立出來,從而提高代碼的可讀性,以便于代碼能夠更好地被組織。
最典型的一一個(gè)應(yīng)用“懶加載”的例子是在對象的getter 方法中實(shí)例化對象的時(shí)候。例如getter方法被重寫,使得在第一次調(diào)用 getter方法時(shí)才實(shí)例化對象并將實(shí)例化的對象返回。判斷是否是第- -次調(diào)用getter 方法可以通過判斷對象是否為空來實(shí)現(xiàn)?!皯屑虞d”的getter方法的實(shí)現(xiàn)方法就像如下:
/* gettar*/
- (NSObject *)objcct {
if(! object) {
_object = INSObject llcl init];
return objeet;
這種實(shí)現(xiàn)方法的缺點(diǎn)是使得gter方法產(chǎn)生副作用,也就是破壞了geter 方法的純潔性。因?yàn)榘凑占s定和習(xí)慣,gttet 方法就是作為接口簡單地將需要的實(shí)例對象返回給外部,這里對內(nèi)容做了簡單的描述。
2.明白原理,為什么要"懶加載"?
答:什么是懶加載,即延遲加載,在你需要的時(shí)候才加載,也就是說在不需要的時(shí)候是不會(huì)加載的,減小了占用內(nèi)存。當(dāng)然在使用懶加載的時(shí)候要注意先加一個(gè)判斷去判斷有無?
iPhone設(shè)備內(nèi)存有限,如果在程序在啟動(dòng)后就一次性加載將來會(huì)用到的所有資源,那么久可能會(huì)耗盡iOS設(shè)備的內(nèi)存。這些資源例如大量的數(shù)據(jù),圖片,音頻,過多的控件等。

3.明白"懶加載"思想是什么?
答: 簡單的將就是拖到最后一刻,萬不得已了,才加載,才開始占用資源。所謂懶加載,寫的就是其getter方法。在開發(fā)中,當(dāng)程序中需要利用的資源時(shí),在程序啟動(dòng)的時(shí)候不加載,只有在運(yùn)行當(dāng)需要這些資源的時(shí)候再去加載這些資源。
4.簡述"懶加載"的好處
答:
1.不必將創(chuàng)建對象的代碼全部寫在viewDidLoad方法中,代碼的可讀性更強(qiáng)。
2.每個(gè)屬性的getter方法中分別負(fù)責(zé)鴿子的實(shí)例化處理,代碼彼此間的獨(dú)立性更強(qiáng)。
3.只有當(dāng)真正需要資源的時(shí)候,用到的時(shí)候才加載,節(jié)省了內(nèi)存資源,占用內(nèi)存小。
5.實(shí)現(xiàn)的步驟:
面試官在有技術(shù)實(shí)列考核上,你再去演示:
1.在 @interface 里聲明需要屬性。比如我需要兩個(gè)控件label和textfield
@interface ViewController ()
@property (nonatomic,strong) UILabel * titleLabel;
@property (nonatomic,strong) UITextField *textField;
@end
2.重寫聲明屬性的getter方法(切記不要自己手動(dòng)寫,Xcode會(huì)自動(dòng)提示出來,寫出就費(fèi)了)
#pragma mark 重寫titleLabel的getter方法
- (UILabel *)titleLabel
{
if (!_titleLabel)
{
self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 20, 100, 40)];
self.titleLabel.textAlignment = NSTextAlignmentCenter;
self.titleLabel.textColor = [UIColor blackColor];
self.titleLabel.text = @"呵呵";
[self.titleLabel sizeToFit];
}
return _titleLabel;
}
3.調(diào)用重寫的方法 self.方法名
//在viewDidLoad里面調(diào)用initUI方法。
- (void)initUI
{
//只是加載到預(yù)想加載的view上。不在初始化方法里為其alloc/init。只是一個(gè)指針,不會(huì)占內(nèi)存。
[self.view addSubview:self.titleLabel];
[self.view addSubview:self.textField];
}
6.需要注意的問題:
1.指針循環(huán)引用問題
if (!_titleLabel)不可以寫成 if (!self.titleLabel),不然就會(huì)形成循環(huán)引用指針。
return _titleLabel;不可以寫成 return self.titleLabel;不然會(huì)形成循環(huán)引用。
2.如果你用vfl語句或者封裝的Masonry布局頁面的話,
關(guān)于frame的那幾句代碼一定不能放重寫的 get 方法里面,不然會(huì)報(bào)錯(cuò)
找不到父視圖的錯(cuò)誤。要放在addSubView那句后面,如:[self.view addSubview:self.textField];
7.有考核 直接對上代碼
實(shí)踐才是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),話不多說直接開干!!
<pre style="overflow: auto; margin: 0px 0px 0px 22px; font-size: 12px !important; overflow-wrap: break-word; font-family: "Courier New" !important;">#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong) UILabel * titleLabel;
@property (nonatomic,strong) UITextField *textField; @end
@implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
[self initUI];
} - (void)initUI
{ //只是加載到預(yù)想加載的view上。不在初始化方法里為其alloc/init。只是一個(gè)指針,不會(huì)占內(nèi)存。
[self.view addSubview:self.titleLabel];
[self.view addSubview:self.textField];
} #pragma mark 重寫titleLabel的getter方法
- (UILabel *)titleLabel
{ if (!_titleLabel) {
self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 20, 100, 40)];
self.titleLabel.textAlignment = NSTextAlignmentCenter;
self.titleLabel.text = @"呵呵";
self.titleLabel.textColor = [UIColor blackColor];
[self.titleLabel sizeToFit];
} return _titleLabel;
} #pragma mark 重寫的textField的getter方法
- (UITextField *)textField
{ if (!_textField) {
self.textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, 100, 40)];
self.textField.borderStyle = UITextBorderStyleRoundedRect;
self.textField.clearButtonMode = UITextFieldViewModeWhileEditing;
self.textField.placeholder = @"hehe";
} return _textField;
} @end</pre>
謝謝你長的這么好看,還關(guān)注我?。?!點(diǎn)個(gè)贊唄!!
你的一次推薦就是對我莫大的支持。感覺不錯(cuò),給個(gè)推薦或者評論吧。
這就是" 懶加載 "相關(guān)的點(diǎn),如果有什么不對的請留言提示,然后有什么別的需要改進(jìn)的提示請聯(lián)系我我會(huì)及時(shí)補(bǔ)充~
over.over.