挖掘有趣的点

Lightweight Generics

简介

Lightweight Generics 轻量级泛型,轻量是因为这是个纯编译器的语法支持(llvm 7.0),和 Nullability 一样,没有借助任何 objc runtime 的升级,也就是说,这个新语法在 Xcode 7 上可以使用且完全向下兼容(更低的 iOS 版本)

示例
1
2
3
4
5
@interface SomeClass<__covariant ObjectType> : XXX
- (ObjectType)objectAtIndex:(NSUInteger)index;
@end

这样很轻易的实现了带泛型的容器。

纪录时间

2016-11-04


Hook NSArray

简介

想通过swizzled修改objectAtIndex:来防止越界崩溃,却发现怎么用NSArray来交换方法是无效的
最后发现原来NSArray的真正类别为__NSArrayI、NSMutableArray的真正类别为__NSArrayM
可以通过打印arr.class来证明

示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
NSArray * arr = [NSArray arrayWithObject:@"1"];
NSLog(@"%@", arr.class);
log >> __NSSingleObjectArrayI
NSArray * arr = [NSArray arrayWithObjects:@"1",@"2", nil];
NSLog(@"%@", arr.class);
log >> __NSArrayI
NSMutableArray * muArr = [NSMutableArray arrayWithObject:@"1"];
NSLog(@"%@", muArr.class);
log >> __NSArrayM
纪录时间

2016-11-04


NSSetUncaughtExceptionHandler

简介

当程序异常退出时,通过NSSetUncaughtExceptionHandler可以捕获异常。

示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
return YES;
}
void uncaughtExceptionHandler(NSException * exception) {
NSArray * callStackSymbols = [exception callStackSymbols];
NSString * reason = [exception reason];
NSString * name = [exception name];
NSString * url = [NSString stringWithFormat:@"%@\n%@\n%@\n%@",
time,name,reason,callStackSymbols];
// Documents/Exception.txt
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"Exception.txt"];
[url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
纪录时间

2016-11-10


UIModalPresentationCustom

简介

一直在想UIAlertController通过Modal跳转后如何同时存在两个视图,后来发现只要修改modalPresentationStyle = UIModalPresentationCustom就可以实现了。

示例
1
viewController.modalPresentationStyle = UIModalPresentationCustom;
纪录时间

2016-11-29