Re: Retain count in non ARC
Re: Retain count in non ARC
- Subject: Re: Retain count in non ARC
- From: Varun Chandramohan <email@hidden>
- Date: Mon, 07 Apr 2014 00:35:07 +0000
- Thread-topic: Retain count in non ARC
Hi Graham,
Thank you for such detailed explanation. I made a few changes except the
type check of what NSPropertyListSerialization returns. Ill be adding that
soon. Other than that, I wanted you to take a look at the changes I made
and let me know if you see any problems. I tested it, at it seems fine and
the warnings went away.
@interface TempConfig : NSObject {
NSMutableArray* ivarContents;
}
@property (retain) NSArray* contents;
- (void) setContents:(NSArray *)serializeObj
{
if (serializeObj) {
ivarContents = [serializeObj mutableCopy];
} else {
ivarContents = [[NSMutableArray alloc] initWithCapacity:10 ];
}
contents = ivarContents;
}
- (id) contents
{
return contents;
}
- (void) addTempObject: (id)object
{
[ivarContents addObject:object];
}
- (void) dealloc
{
[ivarContents release];
contents = nil;
[super dealloc];
}
+ (id) newTempConfigWithSource:(NSString*)source
{
TempConfig* config = [[[self class] alloc] init];
// Read contens from file
NSError *errorDesc = nil;
NSPropertyListFormat format;
NSData *plistXML = [[NSFileManager defaultManager]
contentsAtPath:source];
if( plistXML == nil ) {
[config release];
return nil;
}
// Serialize to array
[config setContents:(NSArray *)[NSPropertyListSerialization
propertyListWithData:plistXML
options:0
format:&format
error:&errorDesc]];
if( [config contents] == nil ) {
[config release];
return nil;
}
return config;
}
There are other methods where I would not be doing
NSPropertyListSerialization, in which case if I pass nil, the API will
allocate mutable array which will be used later using addTempObject method.
Regards,
Varun
On 4/04/2014 2:59 pm, "Graham Cox" <email@hidden> wrote:
>
>On 4 Apr 2014, at 2:40 pm, Graham Cox <email@hidden> wrote:
>
>> Thirdly, casting the return value of [NSPropertyListSerialization
>>propertyListWithData...] to NSMutableArray doesn't turn that object into
>>a mutable array - you've just forced the type system to stop helping
>>you. Certainly retaining it here is the wrong thing to do as well, since
>>this code doesn't own that object, and has no business retaining it.
>>That's what the analyser is trying to tell you.
>
>
>I've just noticed that the situation is even worse than that.
>
>[NSPropertyListSerialization ...] is declared to return an id. What is
>it? Could be anything. It might be an NSArray, might be a NSDictionary,
>might be a string - in fact there's no way to know unless you ask it.
>There is a way to specify that mutable objects are returned, though it's
>not that clear if this method supports it (the documentation appears to
>have a cut/paste error that suggests options are mutability options, but
>elsewhere they are read options which are unimplemented and require that
>you pass 0), but even if it does, you haven't asked for mutable objects.
>
>In this situation I definitely would be writing my own -setContents:
>method, and first thing it would do is to assert that the class of the
>parameter is NSArray. That way if someone screws up and deserializes a
>valid but unexpected property list, your code won't fail horribly, but
>instead can politely throw an exception. I'd also be copying that array
>into a mutable one if you need it to be mutable. Everyone's happy,
>including the crappy documentation writer who hasn't noticed his error.
>
>Code defensively.
>
>--Graham
_______________________________________________
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