• 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: ARC Extending Lifetime of Objects
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ARC Extending Lifetime of Objects


  • Subject: Re: ARC Extending Lifetime of Objects
  • From: Andreas Grosam <email@hidden>
  • Date: Mon, 23 Jul 2012 12:48:07 +0200

On 23.07.2012, at 10:36, Mike Abdullah wrote:

> I think all this begs the questions:
>
> - Why do you want to get these objects stored in arrays rather than a dictionary?
> - Why C arrays, rather than NSArray?

Well, I want to create a new dictionary from copies of elements from another dictionary. I cannot use simply copy or mutableCopy since I want to implement a "deep" copy.

There is

1)  + (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys

and

2)  + (id)dictionaryWithObjects:(const id[])objects forKeys:(const id < NSCopying >[])keys count:(NSUInteger)count

for creation.



I cannot use 1), e.g.

NSArray* keys = [dictionary allKeys];
NSArray* values = [dictionary allValues];

since the order in values is not defined.


Using
- (void)getObjects:(id __unsafe_unretained [])objects andKeys:(id __unsafe_unretained [])keys
however, returns objects in order according their association.

Using the plain C-arry API and manual release/retain would be fine, but it won't work with ARC.


Sure, I could use fast enumeration, and a separate NSArray for keys and values to accomplish what I want. But I was also hoping, the first approach is possibly faster. Using fast enumeration appears quite suboptimal for this task:

NSMutableArray* keys = [NSMutableArray array];
NSMutableArray* values = [NSMutableArray array];
for (id key = dict] {
	id value = [dict objectForKey:key];
	// simplified!
	[keys addObject:[key deepCopy]];
	[values addObject:[value deepCopy]];
}
NSDictionary* result = [NSDictionary dictionaryWithObjects:values forKeys:keys];


By the way: why don't we have:
for (id<NSPair> p = dict] {
	[values addObject:[p.first deepCopy]];
	[keys addObject:[p.second deepCopy]];
}
(which might probably be faster)



Andreas
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: ARC Extending Lifetime of Objects
      • From: Kyle Sluder <email@hidden>
    • Re: ARC Extending Lifetime of Objects
      • From: Mike Abdullah <email@hidden>
References: 
 >ARC Extending Lifetime of Objects (From: Andreas Grosam <email@hidden>)
 >Re: ARC Extending Lifetime of Objects (From: Mike Abdullah <email@hidden>)

  • Prev by Date: Re: Design issue related to my problem with NSSound -isPlaying
  • Next by Date: Re: ARC Extending Lifetime of Objects
  • Previous by thread: Re: ARC Extending Lifetime of Objects
  • Next by thread: Re: ARC Extending Lifetime of Objects
  • Index(es):
    • Date
    • Thread