FROM : Gerd Knops
DATE : Sun Apr 20 17:15:28 2008
On Apr 19, 2008, at 11:33 PM, Chris Hanson wrote:
> On Apr 19, 2008, at 9:55 AM, Gerd Knops wrote:
>> This returns an array with URLs of applicable applications for a
>> file of a given URL:
>>
>> - (NSArray *)applicationsForURL:(NSURL *)url {
>>
>> return (NSArray
>> *)LSCopyApplicationURLsForURL((CFURLRef)url,kLSRolesAll);
>> }
>
> It also leaks -- even if you're running under Objective-C garbage
> collection -- because LSCopyApplicationURLsForURL has "copy" in its
> name and therefore follows the Core Foundation "copy" rule.
>
Sorry, careless copying from a larger context and failure to proof
read... Of course Chris is right.
Gerd
> The proper form for the above method, if you aren't using Objective-
> C garbage collection, is:
>
> - (NSArray *)applicationsForURL:(NSURL *)url {
> return [(NSArray *)LSCopyApplicationURLsForURL((CFURLRef)url,
> kLSRolesAll) autorelease];
> }
>
> This ensures that the returned NSArray will be autoreleased, instead
> of leaked.
>
> If you're using -- or might use -- Objective-C garbage collection,
> you'll want to replace the cast to (NSArray *) with NSMakeColectable
> like this:
>
> - (NSArray *)applicationsForURL:(NSURL *)url {
> return
> [NSMakeCollectable(LSCopyApplicationURLsForURL((CFURLRef)url,
> kLSRolesAll)) autorelease];
> }
>
> The NSMakeCollectable ensures that the CFArrayRef returned by
> LSCopyApplicationURLsForURL will have its lifetime managed by the
> collector if GC is on, since -autorelease has no effect when GC is
> on. This is also correct for non-GC, since NSMakeCollectable when
> GC is off is effectively just a cast from (CFTypeRef) to (id).
>
> -- Chris
>
DATE : Sun Apr 20 17:15:28 2008
On Apr 19, 2008, at 11:33 PM, Chris Hanson wrote:
> On Apr 19, 2008, at 9:55 AM, Gerd Knops wrote:
>> This returns an array with URLs of applicable applications for a
>> file of a given URL:
>>
>> - (NSArray *)applicationsForURL:(NSURL *)url {
>>
>> return (NSArray
>> *)LSCopyApplicationURLsForURL((CFURLRef)url,kLSRolesAll);
>> }
>
> It also leaks -- even if you're running under Objective-C garbage
> collection -- because LSCopyApplicationURLsForURL has "copy" in its
> name and therefore follows the Core Foundation "copy" rule.
>
Sorry, careless copying from a larger context and failure to proof
read... Of course Chris is right.
Gerd
> The proper form for the above method, if you aren't using Objective-
> C garbage collection, is:
>
> - (NSArray *)applicationsForURL:(NSURL *)url {
> return [(NSArray *)LSCopyApplicationURLsForURL((CFURLRef)url,
> kLSRolesAll) autorelease];
> }
>
> This ensures that the returned NSArray will be autoreleased, instead
> of leaked.
>
> If you're using -- or might use -- Objective-C garbage collection,
> you'll want to replace the cast to (NSArray *) with NSMakeColectable
> like this:
>
> - (NSArray *)applicationsForURL:(NSURL *)url {
> return
> [NSMakeCollectable(LSCopyApplicationURLsForURL((CFURLRef)url,
> kLSRolesAll)) autorelease];
> }
>
> The NSMakeCollectable ensures that the CFArrayRef returned by
> LSCopyApplicationURLsForURL will have its lifetime managed by the
> collector if GC is on, since -autorelease has no effect when GC is
> on. This is also correct for non-GC, since NSMakeCollectable when
> GC is off is effectively just a cast from (CFTypeRef) to (id).
>
> -- Chris
>
| Related mails | Author | Date |
|---|---|---|
| Daniel | Apr 19, 18:03 | |
| Gerd Knops | Apr 19, 18:55 | |
| Chris Hanson | Apr 20, 06:33 | |
| Gerd Knops | Apr 20, 17:15 | |
| Daniel | Apr 20, 18:49 |






Cocoa mail archive

