NSRange is just a C struct. I want to create a temporary one in lldb in Xcode at a breakpoint.
Specifically for use in NSArray method objectAtIndex:inRange:
This does not work.
(lldb) expr NSRange $tmpRange = (NSRange){0,4}
(lldb) expr $tmpRange
(NSRange) $tmpRange = location=0, length=4
(lldb) expr -o -- [items indexOfObject:item4 inRange:$tmpRange]
error: no matching constructor for initialization of 'NSRange' (aka '_NSRange')
error: 1 errors parsing expression
My code has an NSRange var named badRange
at the breakpoint, and passing that one in works. Thus:
(lldb) expr -o -- [items indexOfObject:item4 inRange:badRange]
0x7fffffffffffffff
(lldb) expr badRange
(NSRange) $1 = location=0, length=3
What is going on?
Thanks.
Creating a NSRange in the debugger works fine when working in a OS X project but it doesn't for iOS projects. The reason it doesn't work on iOS is that even though Foundation provides the header file in which the struct is declared, it doesn't expose any corresponding symbol. Basically, on iOS, NSRange is just a forward declaration and I do not know the real symbol for the implementation.
I needed to create an NSRange recently whilst trying to debug some code and came across this thread. It is currently possible to do this for iOS projects using Xcode 8.3.2 with the following syntax.
po [@"test words here" stringByReplacingOccurrencesOfString:@"\\s" withString:@"" options:1024 range:(NSRange){0,15}]
This also works:
expr NSRange $tmpRange = (NSRange){0,15}
po [@"test words here" stringByReplacingOccurrencesOfString:@"\\s" withString:@"" options:1024 range:(NSRange)$tmpRange]
Not sure when this was fixed (or if it ever was, as leaving off (NSRange) on the second example results in the same error), but it works now.
来源:https://stackoverflow.com/questions/29835886/how-to-create-and-use-temp-nsrange-in-lldb