REKit
REKit copied to clipboard
動的にメソッドを追加したNSStringオブジェクトが無限ループを引き起こす不具合
respondsToSelector:withKey:usingBlock:
によって動的にメソッドを追加したNSStringのインスタンス(*)を使ってformattedStringを作ろうとすると、無限ループを引き起こす。
(*): 正確には、NSStringクラスクラスタを構成するプライベートなNSStringサブクラスのサブクラス
// This causes endless loop NSString* string = @"hoge"; [string respondsToSelector:@selector() withKey:nil usingBlock:^(NSString* receiver){ NSLog(@"%@", receiver); }]; [string performSelector:@selector()];
// This also causes endless loop NSString* string = @"hoge"; [string respondsToSelector:@selector(_) withKey:nil usingBlock:^(NSString* receiver){ // NOP }]; NSString* string2 = [NSString stringWithFormat:@"%@", string];
// But, it works NSString* string = @"hoge"; [string respondsToSelector:@selector() withKey:nil usingBlock:^(NSString* receiver){ NSString* string2 = [NSString stringWithString:receiver]; NSLog(@"%@", string2); }]; [string performSelector:@selector()];// puts "hoge"
クラッシュ時のコールスタック
Thread 1 com.apple.main-thread 0 -[__NSCFString fastestEncoding] <- EXC_BAD_ACCESS (code=2, address=0xbf7ffffc) 1 -[NSString(NSCFAdditions) _fastestEncodingInCFStringEncoding] 2 CFStringGetFastestEncoding 3 -[__NSCFString fastestEncoding] 4 -[NSString(NSCFAdditions) _fastestEncodingInCFStringEncoding] 5 CFStringGetFastestEncoding . . . 392376 -[__NSCFString fastestEncoding] 392377 -[NSString(NSCFAdditions) _fastestEncodingInCFStringEncoding] 392378 CFStringAppend
392381 _CFLogEx
392382 NSLogv
392383 NSLog
.
.
392417 main
</code></pre>
報告ありがとう! 調査/修正します。