【发布时间】:2020-06-09 00:51:25
【问题描述】:
我用键 NSString 和对象块初始化一个 NSDictionary,就像这样。
NSDictionary * d =
[NSDictionary dictionaryWithObjectsAndKeys:
^ ( int p1 ){ some code }, @"a",
^ ( int p1, NSString * p2 ){ some code }, @"b",
nil];
当我检索其中一些块时,它检索失败,即
someVar = [d objectForKey:@"b"];
即使有与 @"b" 关联的对象也会失败。
当我记录字典时,我注意到我可以检索的对象存储为__NSMallocBlock__,而那些失败的对象存储为__NSStackBlock__。尽管__NSStackBlock__ 似乎有效,但调试器显示它包装了nil 块。
编辑
这很疯狂有两个原因。
首先,我无法仅使用上面的 sn-ps 生成错误。但是,如果块还包含对任何弱指针的引用,则会导致错误。
从而产生你需要的错误
__weak NSString * p = @"ab"; // Some weak pointer
NSDictionary * d =
[NSDictionary dictionaryWithObjectsAndKeys:
^ ( int p1 ){ some code }, @"a",
^ ( int p1, NSString * p2 ){ NSLog( @"%p", p ); }, @"b",
nil];
虽然前面给出的 sn-p 没有任何问题。
我已经尝试了失败的 sn-p,它带有一个指向 self 或上述任意字符串的弱指针,但都失败了。请注意,即使指针无效,日志也应该可以正常工作。
其次,如上所述,当您检索对象时会发生错误!即使我对块什么都不做,只是从字典中检索它,我会得到 EXC_BAD_ACCESS 崩溃。
【问题讨论】:
标签: objective-c objective-c-blocks