Re: NSString** in scanners
Re: NSString** in scanners
- Subject: Re: NSString** in scanners
- From: Bill Bumgarner <email@hidden>
- Date: Wed, 26 Jul 2006 15:25:18 -0700
On Jul 26, 2006, at 2:16 PM, D.K. Johnston wrote:
I understand that if I want the scanned characters to be placed in:
NSString *string;
I need to send "&string" to the method, which then presumably does
something like this:
*string = [internalWorkingString copy];
But if the method got "string" instead of "&string", couldn't it
just do this:
string = [internalWorkingString copy];
with the same result?
Much easier in code:
void foo(NSString *a, NSString **b) {
NSLog(@"1. &a 0x%x", &a);
NSLog(@"1. a 0x%x", a);
NSLog(@"1. b 0x%x", b);
NSLog(@"1. *b 0x%x", *b);
a = [@"foo" copy];
*b = [@"bar" copy];
NSLog(@"2. a 0x%x", a);
NSLog(@"2. b 0x%x", b);
NSLog(@"2. *b 0x%x", *b);
}
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *a = nil;
NSString *b = nil;
NSLog(@"0. &a 0x%x", &a);
NSLog(@"0. a 0x%x", a);
NSLog(@"0. b 0x%x", b);
NSLog(@"0. &b 0x%x", &b);
foo(a, &b);
NSLog(@"3. a 0x%x", a);
NSLog(@"3. b 0x%x", b);
NSLog(@"3. &b 0x%x", &b);
[pool release];
return 0;
}
Which outputs:
2006-07-26 15:22:45.057 foobar[676] 0. &a 0xbffffa18
2006-07-26 15:22:45.057 foobar[676] 0. a 0x0
2006-07-26 15:22:45.057 foobar[676] 0. b 0x0
2006-07-26 15:22:45.057 foobar[676] 0. &b 0xbffffa14
2006-07-26 15:22:45.057 foobar[676] 1. &a 0xbffffa00
2006-07-26 15:22:45.057 foobar[676] 1. a 0x0
2006-07-26 15:22:45.057 foobar[676] 1. b 0xbffffa14
2006-07-26 15:22:45.057 foobar[676] 1. *b 0x0
2006-07-26 15:22:45.058 foobar[676] 2. a 0x2404c
2006-07-26 15:22:45.058 foobar[676] 2. b 0xbffffa14
2006-07-26 15:22:45.058 foobar[676] 2. *b 0x2405c
2006-07-26 15:22:45.058 foobar[676] 3. a 0x0
2006-07-26 15:22:45.058 foobar[676] 3. b 0x2405c
2006-07-26 15:22:45.058 foobar[676] 3. &b 0xbffffa14
Note that the address of a is different in foo() than in main().
Variables passed to functions are copied -- the bytes are copied, not
it invokes -copy to copy the contents of the variable -- as they are
passed to a function. 'b' works because you are a passing a pointer
to a pointer to a string... the pointer to the pointer is copied and,
thus, foo() can then set the pointer's value even though it is
actually a copy of the pointer to the pointer that was passed in.
Perfectly clear, right? :-)
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden