Runtime視頻
https://yunpan.cn/OcPcBAPbezTdzp
開場(chǎng)
- 詳細(xì)介紹自己做過(guò)的最有成就感的一個(gè)項(xiàng)目
- 最近在讀什么哪本書?
- 是否有過(guò)創(chuàng)業(yè)經(jīng)歷或者有過(guò)類似的想法?
- 為什么會(huì)參加競(jìng)賽瀑志,過(guò)程中的收獲是什么?
- 是否參與過(guò)開源項(xiàng)目,收獲是什么?
- 商場(chǎng)里買100元的東西會(huì)返80元代金元實(shí)際折扣是多少
- 四個(gè)人夜間要過(guò)一座橋,每人走路速度不一樣仅仆,過(guò)橋需要時(shí)間分別是1夏醉,2靶擦,5,10
分鐘♀善現(xiàn)在只有一只手電筒在過(guò)橋時(shí)必須帶,同時(shí)只能兩人過(guò)局骤,如何安排能夠讓四
人最快速度過(guò)橋庄涡? - 25匹馬賽跑忧风,每次只能跑5匹吃度,最快能賽幾次找出跑得最快的3匹馬多律?
- 如果你變成硬幣那么小,然后被扔進(jìn)一個(gè)攪拌機(jī)里收毫,你將如何脫身
知識(shí)性問(wèn)題
- 1.什么是響應(yīng)鏈攻走,它是怎么工作的?
- 2.如何訪問(wèn)并修改一個(gè)類的私有屬性此再?
通過(guò)KVC和Runtime訪問(wèn)和修改私有屬性
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,strong)NSString *age;
@property (nonatomic, copy) NSString * height;
@property (nonatomic, copy) NSString * sex;
@end
--------------------------------------------------------
#import <Foundation/Foundation.h>
#import "Person.h"
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//KVC訪問(wèn)私有成員屬性
Person *person = [[Person alloc]init];
[person setValue:@"m" forKey:@"name"];
[person setValue:@"18" forKey:@"age"];
NSString *name = [person valueForKey:@"name"];
NSString *age = [person valueForKey:@"age"];
NSLog(@"person = %@, name = %@, age = %@",person, name,age);
//Runtime訪問(wèn)私有屬性
unsigned int count = 0;
Ivar *member = class_copyIvarList([person class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = member[i];
const char *memberName = ivar_getName(ivar);
NSLog(@"memberName = %s",memberName);
Ivar nameN = member[0];
//修改屬性值
object_setIvar(person,nameN , @"Mao");
//NSLog(@"nameN = %s",nameN);
}
}
return 0;
}
打印結(jié)果
2016-04-22 11:30:31.658 Runtime[7715:476346] person = <Person: 0x100206d90>, name = m, age = 18
2016-04-22 11:30:31.659 Runtime[7715:476346] memberName = _name
2016-04-22 11:30:31.659 Runtime[7715:476346] memberName = _age
2016-04-22 11:30:31.659 Runtime[7715:476346] memberName = _height
2016-04-22 11:30:31.660 Runtime[7715:476346] memberName = _sex
**Program ended with exit code: 0**
- 3.iOS Extension 是什么昔搂?能列舉幾個(gè)常用的 Extension 么?
Extension是 iOS 8的重大更新
今日插件(Today widget)
分享(Share)
操作(Action)
圖片編輯(Photo Editing)
文檔管理(Document Provider)
自定義鍵盤(Custom keyboard)
4 如何把一個(gè)包含自定義對(duì)象的數(shù)組序列化到磁盤输拇?
優(yōu)先個(gè)步驟是讓你的Person類NSCoding協(xié)議摘符。其基本策略是序列化和非序列化每個(gè)想要會(huì)話之間持久化對(duì)象的實(shí)例變量。5.什么是響應(yīng)鏈,它是怎么工作的逛裤?
UIResponse對(duì)象擁有一個(gè)nextResponder指針的時(shí)候相關(guān)的對(duì)象可以通過(guò)該指針組成一個(gè)響應(yīng)對(duì)象鏈瘩绒,當(dāng)觸摸View,通過(guò)這個(gè)指針指向UIViewController -->UIWindow-->UIApplication带族,(通過(guò)nextResponder指針)
//響應(yīng)對(duì)象鏈
//
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
//觸摸次數(shù)
if (touch.tapCount == 1) {
[[self nextResponder] touchesBegan:touches withEvent:event];
return;
}
MMHLogFunc;
}
- 6.為什么用隊(duì)列管理事件,而不用棧锁荔?
隊(duì)列先進(jìn)先出,能保證先產(chǎn)生的事件先處理。棧先進(jìn)后出蝙砌。
7.線程同步(線程加鎖)阳堕,線程安全問(wèn)題
Synchronize(self){ 需要加鎖的代碼 }
優(yōu)點(diǎn):防止多條線程搶奪同一塊資源
缺點(diǎn):消耗CPU資源
買票問(wèn)題
//三條線程同時(shí)賣票
NSThread thread01 = [[NSThread alloc] init];
NSThread thread02 = [[NSThread alloc] init];
NSThread thread03 = [[NSThread alloc] init];
//啟動(dòng)線程
[thread01 start];
[thread02 start];
[thread03 start];
//線程就緒
//線程Running運(yùn)行
//線程阻塞(sleep)
NSInteger count = 100;//100張票
While(1)
{
synchronize(self){
//賣票代碼
}
}
8.原子性與非原子性屬性
atomic:線程安全的(自動(dòng)加鎖,消耗大量CPU择克,set和get方法自動(dòng)加鎖恬总,但是平凡調(diào)用)
noatomic:非線程安全的
避免搶奪同一塊資源,在服務(wù)器端處理
線程間的通信
舉例下載和傳輸方法在子線程中執(zhí)行祠饺,執(zhí)行完畢 后再主線程調(diào)用
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 在子線程中調(diào)用download方法下載圖片
[self performSelectorInBackground:@selector(download) withObject:nil];
}
-(void)download
{
//1.根據(jù)URL下載圖片
//從網(wǎng)絡(luò)中下載圖片
NSURL *urlstr=[NSURL URLWithString:@"fdsf"];
//把圖片轉(zhuǎn)換為二進(jìn)制的數(shù)據(jù)
NSData *data=[NSData dataWithContentsOfURL:urlstr];//這一行操作會(huì)比較耗時(shí)
//把數(shù)據(jù)轉(zhuǎn)換成圖片
UIImage *image=[UIImage imageWithData:data];
//2.回到主線程中設(shè)置圖片
[self performSelectorOnMainThread:@selector(settingImage:) withObject:image waitUntilDone:NO];
}
//設(shè)置顯示圖片
-(void)settingImage:(UIImage *)image
{
self.iconView.image=image;
}
GCD常用函數(shù)
dispatch_barrier_async(queue , ^{
)
//barrier的作用是越驻,先執(zhí)行它前面的,執(zhí)行完之后再執(zhí)行后面的
- 延遲執(zhí)行方法(NSTimer道偷,performSlector ... afterDealy)
- 一次性執(zhí)行
dispatch_once
在程序運(yùn)行中只被執(zhí)行一次缀旁。防止多次加載資源 - 快速迭代,
dispatch_apply
比f(wàn)or循環(huán)高效勺鸦,比如:剪切文件到某個(gè)文件夾中并巍。for循環(huán)是一次一次執(zhí)行,快速迭代幾乎同時(shí)執(zhí)行换途。
RunLoop
提高CPU性能懊渡,循環(huán)處理各種消息事件。