NSDictionary-NilSafe
NSDictionary-NilSafe copied to clipboard
iOS16bug,会导致内存暴涨到崩溃,求大佬看看
self.navigationItem.rightBarButtonItem = ; 自定义系统导航栏右按钮会莫名导致内存暴涨,找不到原因
一个处理方案
一个处理方案
作者您好,我是把[class gl_swizzleMethod:@selector(setObject:forKeyedSubscript:) withMethod:@selector(gl_setObject:forKeyedSubscript:)]; 这个交换方法注释调了,也没问题. 而且我在项目中写做了测试,
NSMutableDictionary * md =[NSMutableDictionary dictionary]; [md setObject:nil forKey:@"kkk"]; (会崩溃) md[@"kkk"] = nil; (不崩溃) [md setObject:nil forKeyedSubscript:@"kkkk"];(不奔溃) 不知道当时您涉及的初衷是啥 为啥要加这个交换呢 ,我要是去掉这个交换方法,会有啥弊端呢 .大佬希望您能给解答下.
官方解析 setObject:forKeyedSubscript: 这个方法中的参数 object 是可以传 nil 的,并且传 nil 时会将对应的 key 移除,目前 NilSafe 中 hook 了这个方法是同时将 obj 为 nil 的情况过滤了,可能这样会导致一些系统性逻辑错误,你可以试试将该条件移除试试
- (void)gl_setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key {
// if (!key || !obj) {
// return;
// }
if (!key) {
return;
}
[self gl_setObject:obj forKeyedSubscript:key];
}
参考: 1、setObject:forKeyedSubscript: | Apple Developer Documentation
官方解析 setObject:forKeyedSubscript: 这个方法中的参数 object 是可以传 nil 的,并且传 nil 时会将对应的 key 移除,目前 NilSafe 中 hook 了这个方法是同时将 obj 为 nil 的情况过滤了,可能这样会导致一些系统性逻辑错误,你可以试试将该条件移除试试
- (void)gl_setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key { // if (!key || !obj) { // return; // } if (!key) { return; } [self gl_setObject:obj forKeyedSubscript:key]; }
参考: 1、setObject:forKeyedSubscript: | Apple Developer Documentation
感谢大佬提点
官方解析 setObject:forKeyedSubscript: 这个方法中的参数 object 是可以传 nil 的,并且传 nil 时会将对应的 key 移除,目前 NilSafe 中 hook 了这个方法是同时将 obj 为 nil 的情况过滤了,可能这样会导致一些系统性逻辑错误,你可以试试将该条件移除试试
- (void)gl_setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key { // if (!key || !obj) { // return; // } if (!key) { return; } [self gl_setObject:obj forKeyedSubscript:key]; }
参考:
1、setObject:forKeyedSubscript: | Apple Developer Documentation
感谢,我有空改一下发个版本。这个 repo 很久没有维护了,抱歉。