'寫在前面'
這些是我對iOS面試時會碰到的問題的解決方法,整理出來分享給大家,有些錯誤不要
太好笑,希望對大家有所幫助。大家有更好的解決辦法也歡迎溝通交流。
一直以來都有寫點兒東西的想法,就從筆記、從閱讀開始吧,加油!'
對于剛去面試的ios開發的小白來說,就怕面試官的靈魂提問,代碼是敲不完的,bug也是改不完的,你只能漸漸去完善,所以面對面試官的技術提問,就應更加完善的回答,下面我就對懶加載這個技術點簡單的給各位做下復習吧!!
1.概念問題,什么是“懶加載”?
來些基礎性的書本知識性的概念吧!!(我知道你看過書,但是呢!吾日三省吾身嘛!!接著看吧......)
所謂“懶加載”(Lazy loading) 也被叫作“延遲加載 ”,它的核心思想是把對象的實例化盡量延遲,直到真正用到的時候才將其實例化,這樣做的好處是可以減輕大量對象在實例化時對資源的消耗,而不是在程序初始化的時候就預先將對象實例化。另外,“懶加載”可以將對象的實例化代碼從初始化方法中獨立出來,從而提高代碼的可讀性,以便于代碼能夠更好地被組織。
最典型的一一個應用“懶加載”的例子是在對象的getter 方法中實例化對象的時候。例如getter方法被重寫,使得在第一次調用 getter方法時才實例化對象并將實例化的對象返回。判斷是否是第- -次調用getter 方法可以通過判斷對象是否為空來實現。“懶加載”的getter方法的實現方法就像如下:
/* gettar*/
- (NSObject *)objcct {
if(! object) {
_object = INSObject llcl init];
return objeet;
這種實現方法的缺點是使得gter方法產生副作用,也就是破壞了geter 方法的純潔性。因為按照約定和習慣,gttet 方法就是作為接口簡單地將需要的實例對象返回給外部,這里對內容做了簡單的描述。
2.明白原理,為什么要"懶加載"?
答:什么是懶加載,即延遲加載,在你需要的時候才加載,也就是說在不需要的時候是不會加載的,減小了占用內存。當然在使用懶加載的時候要注意先加一個判斷去判斷有無?
iPhone設備內存有限,如果在程序在啟動后就一次性加載將來會用到的所有資源,那么久可能會耗盡iOS設備的內存。這些資源例如大量的數據,圖片,音頻,過多的控件等。
3.明白"懶加載"思想是什么?
答: 簡單的將就是拖到最后一刻,萬不得已了,才加載,才開始占用資源。所謂懶加載,寫的就是其getter方法。在開發中,當程序中需要利用的資源時,在程序啟動的時候不加載,只有在運行當需要這些資源的時候再去加載這些資源。
4.簡述"懶加載"的好處
答:
1.不必將創建對象的代碼全部寫在viewDidLoad方法中,代碼的可讀性更強。
2.每個屬性的getter方法中分別負責鴿子的實例化處理,代碼彼此間的獨立性更強。
3.只有當真正需要資源的時候,用到的時候才加載,節省了內存資源,占用內存小。
5.實現的步驟:
面試官在有技術實列考核上,你再去演示:
1.在 @interface 里聲明需要屬性。比如我需要兩個控件label和textfield
@interface ViewController ()
@property (nonatomic,strong) UILabel * titleLabel;
@property (nonatomic,strong) UITextField *textField;
@end
2.重寫聲明屬性的getter方法(切記不要自己手動寫,Xcode會自動提示出來,寫出就費了)
#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.調用重寫的方法 self.方法名
//在viewDidLoad里面調用initUI方法。
- (void)initUI
{
//只是加載到預想加載的view上。不在初始化方法里為其alloc/init。只是一個指針,不會占內存。
[self.view addSubview:self.titleLabel];
[self.view addSubview:self.textField];
}
6.需要注意的問題:
1.指針循環引用問題
if (!_titleLabel)不可以寫成 if (!self.titleLabel),不然就會形成循環引用指針。
return _titleLabel;不可以寫成 return self.titleLabel;不然會形成循環引用。
2.如果你用vfl語句或者封裝的Masonry布局頁面的話,
關于frame的那幾句代碼一定不能放重寫的 get 方法里面,不然會報錯
找不到父視圖的錯誤。要放在addSubView那句后面,如:[self.view addSubview:self.textField];
7.有考核 直接對上代碼
實踐才是檢驗真理的唯一標準,話不多說直接開干!!
<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
{ //只是加載到預想加載的view上。不在初始化方法里為其alloc/init。只是一個指針,不會占內存。
[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>
謝謝你長的這么好看,還關注我!!!點個贊唄!!
你的一次推薦就是對我莫大的支持。感覺不錯,給個推薦或者評論吧。
這就是" 懶加載 "相關的點,如果有什么不對的請留言提示,然后有什么別的需要改進的提示請聯系我我會及時補充~
over.over.