關(guān)于A vc pop回 B vc 之后, A的dealloc不執(zhí)行的幾種可能原因:
感謝http://www.jvaeyhcd.cc/2016/04/06/iOS中造成dealloc不調(diào)用的原因/
聲明的代理不是assign類型(順便提一句, .h文件中block的聲明是copy修飾, 雖然這和循環(huán)引用無關(guān));
說到這順便說一句
weak: 當(dāng)弱變量引用的對象被別的變量釋放包竹,那么弱變量會被自動設(shè)置為nil酵使,這樣可以有效地防止崩潰, 但是assign并不會將其置空, 所以代理用assign修飾, 防止在dealloc中要使用-
block閉包回調(diào)中, 所以用到下劃線或者self的地方, 統(tǒng)統(tǒng)要
__block Viewcontroller *weakSelf = self;
然后用weakself修飾, 不論系統(tǒng)有沒有出現(xiàn)黃警都必須如此, 哪怕出現(xiàn)一個都會使retain count不能減為1, 導(dǎo)致dealloc不執(zhí)行,
這里使用MJRefresh的同學(xué)特別要注意, 他家的閉包回調(diào), 必須使用修飾符修飾self
不過, 系統(tǒng)動畫, GCD等的系統(tǒng)方法的閉包內(nèi)則用self即可;
3 . A中存在timer的情況, 則在離開的時候必須使timer失效;
4 . B在A中是以屬性懶加載的形式, 跳轉(zhuǎn)過來, 則被持續(xù)持有, 不會進入dealloc
在含有UISearchController的vc, 返回退出時控制臺發(fā)出這樣的警告:
Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<UISearchController:balabala
在創(chuàng)建UISearchController的時候加一句這個即可:
[_searchController loadViewIfNeeded];
重寫初始化
建議重寫initWithFrame, 這樣外部調(diào)用init或initWithFrame都是可以執(zhí)行的
關(guān)于xib
在vc不能用alloc init創(chuàng)建, 只能使用
[[[NSBundle mainBundle] loadNibNamed:@"xib文件名" owner:nil options:nil] firstObject];
封裝時可把此句寫在該view的類方法中, 供外部調(diào)用
xib初始化走的是以下這句
- (instancetype)initWithCoder:(NSCoder *)aDecoder
所以可在此方法內(nèi)往nib對應(yīng)的view添加子視圖.
但是, 當(dāng)xib上的子控件要添加子視圖時, 不可通過重寫以上方法來創(chuàng)建, 此時處于xib上的子控件處于未喚醒狀態(tài), 應(yīng)該通過重寫來創(chuàng)建
- (void)awakeFromNib
KVC
- setValueForKeyPath和setValueForKey
前者包含了后者的功能, 前者在keyPath使用內(nèi)部點語法(字符串形式)可以層層往里訪問內(nèi)部屬性, 注意, key值必須在屬性值中可以找到
如A和B兩個model類, Bmodel中有屬性c, A中有B的屬性b
A屬性a, [a setValue:@"hhh" forKeyPath:b.c];
2.使用前者還可修改類的私有變量, 加入在A類中聲明一個變量_h, 則可以在類外, 通過A的實例變量a, [a setValue:"aaa" forKeyPath:@"_h"];來修改, keyPath字符串直接寫"h"也是可以的
3.假設(shè)A類實例變量a, A類中有一個屬性name
[a addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context];
假設(shè)先給name賦值@"a", 再賦值@"b", 則在- (void)obserValueForKeyPath:(NSString *)keyPath ......的方法, 打印keyPath, object和change, 會打印kind=1; new=@"b", old=@"a"