• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: NSString** in scanners
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


References: 
 >Fwd: NSString** in scanners (From: "D.K. Johnston" <email@hidden>)

  • Prev by Date: Re: Plugins loading frameworks
  • Next by Date: universal/intel zlib in framework
  • Previous by thread: Fwd: NSString** in scanners
  • Next by thread: Capture WebView in a NSImage
  • Index(es):
    • Date
    • Thread