NSDictionary-NilSafe icon indicating copy to clipboard operation
NSDictionary-NilSafe copied to clipboard

iOS16bug,会导致内存暴涨到崩溃,求大佬看看

Open Zorodon opened this issue 2 years ago • 5 comments

self.navigationItem.rightBarButtonItem = ; 自定义系统导航栏右按钮会莫名导致内存暴涨,找不到原因

Zorodon avatar Sep 27 '22 06:09 Zorodon

一个处理方案 image

nablxc avatar Feb 28 '23 04:02 nablxc

一个处理方案 image 作者您好,我是把[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"];(不奔溃) 不知道当时您涉及的初衷是啥 为啥要加这个交换呢 ,我要是去掉这个交换方法,会有啥弊端呢 .大佬希望您能给解答下.

wuruijie avatar Mar 16 '23 03:03 wuruijie

官方解析 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

Jacob-LJ avatar Mar 17 '23 08:03 Jacob-LJ

官方解析 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

感谢大佬提点

wuruijie avatar Mar 17 '23 08:03 wuruijie

官方解析 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 很久没有维护了,抱歉。

allenhsu avatar Mar 17 '23 15:03 allenhsu