strong和weak
- strong修飾的指針變量指向?qū)ο髸r拆撼,當指針指向新值或者指針不復(fù)存在储矩,相關(guān)聯(lián)的對象就會自動釋放,而weak修飾的指針變量指向?qū)ο螅攲ο蟮膿碛姓咧赶蛐轮祷蛘卟淮嬖跁rweak修飾的指針會自動置為nil殷勘。
在 Objective-C 中如何實現(xiàn) KVO
KVO
- 注冊觀察者(注意:觀察者和被觀察者不會被保留也不會被釋放)
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath
options:(NSKeyValueObservingOptions)options
context:(void *)context;
接收變更通知
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
移除對象的觀察者身份
- (void)removeObserver:(NSObject *)observer
forKeyPath:(NSString *)keyPath;
KVO中誰要監(jiān)聽誰注冊,然后對響應(yīng)進行處理昔搂,使得觀察者與被觀察者完全解耦玲销。KVO只檢測類中的屬性,并且屬性名都是通過NSString來查找摘符,編譯器不會檢錯和補全贤斜,全部取決于自己。
堆和棧
- 棧區(qū)(stack)由編譯器自動分配釋放 ,存放方法(函數(shù))的參數(shù)值, 局部變量的值等逛裤,棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu)瘩绒,是一塊連續(xù)的內(nèi)存的區(qū)域。即棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的带族。
- 堆區(qū)(heap)一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時由OS回收锁荔,向高地址擴展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域蝙砌,從而堆獲得的空間比較靈活阳堕。
- 碎片問題:對于堆來講,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù)择克,從而造成大量的碎片恬总,使程序效率降低。對于棧來講肚邢,則不會存在這個問題壹堰,因為棧是先進后出的隊列,他們是如此的一一對應(yīng)骡湖,以至于永遠都不可能有一個內(nèi)存塊從棧中間彈出.
- 分配方式:堆都是動態(tài)分配的贱纠,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配响蕴。靜態(tài)分配是編譯器完成的并巍,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進行分配换途,但是棧的動態(tài)分配和堆是不同的懊渡,他的動態(tài)分配是由編譯器進行釋放刽射,無需我們手工實現(xiàn)。
UIViewController的生命周期
-[ViewController initWithNibName:bundle:]剃执;
-[ViewController init]誓禁;
-[ViewController loadView];
-[ViewController viewDidLoad]肾档;
-[ViewController viewWillAppear:]摹恰;
-[ViewController viewWillLayoutSubviews:];
-[ViewController viewDidLayoutSubviews:]怒见;
-[ViewController viewDidAppear:]俗慈;
-[ViewController viewWillDisappear:];
-[ViewController viewDidDisappear:]遣耍;
-[ViewController viewWillUnload:]闺阱;
-[ViewController viewDidUnload:];
CRC8校驗
文檔提供的代碼為:
static U8 CRC8(U8 *ptr, U8 len)
{
U8 crc;
U8 i;
crc = 0;
while(len--)
{
crc ^= *ptr++;
for(i = 0; i < 8; i++)
{
if(crc & 0x01)
{
crc = (crc >> 1) ^ 0x8c;
}
else {
crc >>= 1;
}
}
}
return crc;
}
轉(zhuǎn)換為iOS代碼為:
- (Byte)CRC8Result:(Byte *)bytes length:(NSInteger)length {
Byte crc = 0x00;
for (int k = 0; k < length - 1; k++) {
crc ^= bytes[k];
for (int i = 0; i < 8; i++) {
if (crc & 0x01) {
crc = (crc >> 1) ^ 0x8c;
} else {
crc >>= 1;
}
}
}
NSLog(@"crc校驗碼%@", [NSString stringWithFormat:@"%0.2hhx", (char)crc]);
return crc;
}