1、weak的底層實現(xiàn)
Runtime維護了一個weak表耙厚,用于存儲指向某個對象的所有weak指針俺夕。
weak表其實是一個hash(哈希)表批什,
Key是所指對象的地址难捌,Value是weak指針的地址(這個地址的值是所指對象的地址)數(shù)組囚聚。
weak 的實現(xiàn)原理可以概括一下三步:
1贺拣、初始化時:
runtime會調(diào)用objc_initWeak函數(shù)蓖谢,初始化一個新的weak指針指向?qū)ο蟮牡刂贰?2、添加引用時:
objc_initWeak函數(shù)會調(diào)用 objc_storeWeak() 函數(shù)譬涡,
objc_storeWeak() 的作用是更新指針指向闪幽,創(chuàng)建對應(yīng)的弱引用表。
3涡匀、釋放時:
調(diào)用clearDeallocating函數(shù)盯腌。
clearDeallocating函數(shù)首先根據(jù)對象地址獲取所有weak指針地址的數(shù)組,
然后遍歷這個數(shù)組把其中的數(shù)據(jù)設(shè)為nil渊跋,
最后把這個entry從weak表中刪除腊嗡,最后清理對象的記錄。
http://www.cocoachina.com/ios/20170328/18962.html
2拾酝、autoreleasepool
Tagged Pointer
偽對象燕少,小于10位數(shù)的數(shù)字,值直接存放在指針中蒿囤,解決64位系統(tǒng)客们,內(nèi)存占用問題
類函數(shù)方法返回對象為unretained return value,生命周期被延長材诽,不一定會使用 autorelease
http://www.cocoachina.com/ios/20170303/18829.html
3底挫、dispatch_onec synchronized nonatomic atomic
synchronized 遞歸互斥鎖
dispatch_onec 原子性 信號量完成線程同步 參數(shù)要是靜態(tài)全局參數(shù)
atomic 自旋鎖 循環(huán)等待直到解鎖 自旋鎖效率高于互斥鎖
http://www.reibang.com/p/ef3f77c8b320
4、copy mutableCopy
不可變對象
copy 淺拷貝 內(nèi)存地址不變 結(jié)果對象不可變 只改變指針地址
mutableCopy 深拷貝 內(nèi)存地址變化 結(jié)果為可變
可變對象
copy mutableCopy 都為深拷貝 內(nèi)存地址變化
容器類對象脸侥,copy mutableCopy 內(nèi)部對象地址不變
copy修飾屬性時 不管聲明類型為什么 賦值后都變成不可變
自定義對象 實現(xiàn)copy 要重寫 copyWithZone
[[NSMutableArray alloc] initWithArray:arr1 copyItems:YES] 元素深拷貝
http://www.cocoachina.com/ios/20170601/19402.html
5建邓、hit-test 響應(yīng)鏈
1、擴大UIButton的響應(yīng)熱區(qū)
重載UIButton的-(BOOL)pointInside: withEvent:方法睁枕,讓Point即使落在Button的Frame外圍也返回YES
2官边、子view超出了父view的bounds響應(yīng)事件
重載父view的-(UIView *)hitTest: withEvent:方法,去掉點擊必須在父view內(nèi)的判斷外遇,
然后子view就能成為 hit-test view注簿,用于響應(yīng)事件
http://www.reibang.com/p/d8512dff2b3e
6、多線程
http://www.360doc.com/content/15/0618/17/19663521_479024177.shtml
http://www.cocoachina.com/ios/20180313/22573.html
7跳仿、單項鏈表
1诡渴、判斷環(huán),找出節(jié)點
*********************************************************************
* 函數(shù)名稱:linklist *IsLoop(linklist *head)
* 函數(shù)功能:判斷鏈表是否含有環(huán)菲语,并找出環(huán)的入口
* 參 數(shù):head----鏈表的頭結(jié)點
* 返 回 值:若有環(huán)妄辩,則返回鏈表中環(huán)的入口結(jié)點惑灵;否則返回NULL
* 說 明:程序參考定理:碰撞點p到連接點的距離=頭指針到連接點的距離
*********************************************************************
extern linklist *IsLoop(linklist *head)
{
linklist *p1=head, *p2=head;
int IsLoopFlag=0;
if (head==NULL)
return NULL;
while (p2->next!=NULL && p2->next->next!=NULL)
{
p1 = p1->next;
p2 = p2->next->next;
if (p1==p2)
{
IsLoopFlag = 1;
break;
}
}
if (!IsLoopFlag)
return NULL;
else
{
// p2指向頭結(jié)點,p1在第一次相遇點恩袱。
// 之后利用定理泣棋,當(dāng)p1再次等于p2時,相遇點即為環(huán)的入口結(jié)點
p2 = head;
while (p1!=p2)
{
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
}
2畔塔、反轉(zhuǎn)
迭代:
linkList reverse(linkList head) {
linkList p,q,pr;
p = head->next;
q = NULL;
head->next = NULL;
while(p) {
pr = p->next;
p->next = q;
q = p;
p = pr;
}
head->next = q;
return head;
}
Node * Node_reverse_v2(Node* node) {
if (node == NULL) return NULL;
if (node->next == NULL) return node;
Node *first = node; //總是指向新鏈表的首部潭辈。
Node *now = node->next;
Node *next = now->next;
first->next = NULL; //首節(jié)點變成尾節(jié)點,尾節(jié)點的下一個節(jié)點置空澈吨,防止環(huán)路把敢。
do {
next = now->next;
now->next = first;
first = now;
now = next;
} while (next != NULL);
return first;
}
遞歸:
Node * Node_reverse(Node *node) {
if (node == NULL) return NULL;
if (node->next == NULL) return node;
Node * n = Node_reverse(node->next);
if (n != NULL) {
n->next = node;
node->next = NULL;
}
return node;
}
8、Bounds Frame
frame 針對父視坐標(biāo)系圖計算
bounds 針對自身坐標(biāo)系谅辣,改變bounds的x修赞、y,影響子視圖位置
scrollView 滾動和邊距原理桑阶,都是改變bounds的柏副,x、y
改變bounds的大小蚣录,參照點是center割择,frame隨之改變
https://blog.csdn.net/chenyufeng1991/article/details/51764303
9、鎖 性能
1萎河、OSSpinLock 自旋鎖荔泳,最快,消耗大量 CPU 資源
不絕對安全虐杯,線程高低優(yōu)先級玛歌,造成優(yōu)先級反轉(zhuǎn)
2、dispatch_semaphore pthread_mutex 性能好
3擎椰、synchronized 慢
http://www.cocoachina.com/ios/20160707/16957.html
https://blog.ibireme.com/2016/01/16/spinlock_is_unsafe_in_ios/
10支子、setValue和setObject的區(qū)別
1、 setObject:forkey:中value是不能夠為nil的达舒,不然會報錯值朋。
setValue:forKey:中value能夠為nil,但是當(dāng)value為nil的時候休弃,會自動調(diào)用removeObject:forKey方法
2吞歼、setValue:forKey:中key的參數(shù)只能夠是NSString類型圈膏,而setObject:forKey:的可以是任何類型
https://blog.csdn.net/itianyi/article/details/8661997
11塔猾、NSArray NSMutableArray 線程安全
NSMutableArray本身是線程不安全的,NSArray安全
不使用atomic修飾屬性
1 稽坤、atomic 的內(nèi)存管理語義是原子性的丈甸,僅保證了屬性的setter和getter方法是原子性的糯俗,是線程安全的,但是屬性的其他方法睦擂,
如數(shù)組添加/移除元素等并不是原子操作得湘,所以不能保證屬性是線程安全的。
2 顿仇、atomic雖然保證了getter淘正、setter方法線程安全,但是付出的代價很大臼闻,執(zhí)行效率要比nonatomic慢很多倍(有說法是慢10-20倍)
3鸿吆、使用nonatomic修飾NSMutableArray對象就可以了,而使用鎖述呐、dispatch_queue來保證NSMutableArray對象的線程安全
實現(xiàn):GCD用同步并行隊列讀操作惩淳,barrier(按照插入隊列順序,執(zhí)行完才執(zhí)行后邊)寫操作
https://blog.csdn.net/kangguang/article/details/79194563
12乓搬、算法 兩個升序數(shù)組找相同元素
- (NSArray *)sameFromTwoArray:(NSArray *)arr1 array2:(NSArray *)arr2 {
NSMutableArray *resultArr = [NSMutableArray array];
for (int i=0, j=0; i<arr1.count && j< arr2.count;) {
if (arr1[i] == arr2[j]) {
[resultArr addObject:arr1[i]];
i++;
j++
} else if (arr1[i] > arr2[j]) {
j++;
} else {
i++;
}
}
return resultArr;
}
13思犁、二分查找
int binarySearch(int arr[], int len, int key)
{
int left = 0;
int right = len - 1;
int mid;
while (left <= right) {
mid = (left + right) / 2;
if (key < arr[mid]) {//key在左邊
right = mid - 1;
} else if (arr[mid] < key) {//key在右邊
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
https://www.cnblogs.com/bofengyu/p/6761389.html
14、_ _block _ _weak
1.__block不管是ARC還是MRC模式下都可以使用进肯,可以修飾對象激蹲,還可以修飾基本數(shù)據(jù)類型。
2.__weak只能在ARC模式下使用坷澡,也只能修飾對象(NSString)托呕,不能修飾基本數(shù)據(jù)類型(int)。
3.__block對象可以在block中被重新賦值频敛,__weak不可以项郊。
4.__block對象在ARC下可能會導(dǎo)致循環(huán)引用,非ARC下會避免循環(huán)引用斟赚,__weak只在ARC下使用着降,可以避免循環(huán)引用,
__block避免循環(huán)引用需要在block內(nèi)部把__block修飾的obj置為nil
5.__weak 本身是可以避免循環(huán)引用的問題的拗军,但是其會導(dǎo)致外部對象釋放了之后任洞,
block內(nèi)部也訪問不到這個對象的問題,可以通過在 block 內(nèi)部聲明一個__strong 的變量來指向 weakObj发侵,
使外部對象既能在 block 內(nèi)部保持住交掏,又能避免循環(huán)引用的問題
https://www.cnblogs.com/xu-antong/p/6503344.html
https://www.cnblogs.com/yajunLi/p/6203222.html?utm_source=itdadao&utm_medium=referral