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>
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