Re: XML Resource Release
Re: XML Resource Release
- Subject: Re: XML Resource Release
- From: "Gary L. Wade" <email@hidden>
- Date: Fri, 20 May 2011 12:28:34 -0700
- Thread-topic: XML Resource Release
In your Xcode text window, hold down the option key and double click on
NSString. You will be given the option of viewing an overview of the
class. Click on the icon in the upper right side of the window that looks
like a book. This will show you a view of the documentation for NSString.
When looking at the documentation, click Command-F to do a search and
enter "const char *" or a substring of that until you find the answer you
want.
Read the exceptions being thrown. Most likely it says something about
autorelease pools. Do the same thing for the class it mentions that you
did for NSString, albeit leaving out the particular point of searching for
NSString.
On 05/20/2011 12:04 PM, "Bing Li" <email@hidden> wrote:
>Dear Evadne and all,
>
>I appreciate so much for your replies!
>
>You change the return value from (const char *) to (NSString *). In my
>system, since I need to send the XML to a server via BSD socket. I have to
>convert it to (const char *).
>
>But I got another problem. If autoreleasing xmlStr or release xmlStr
>before
>returning the (const char *) value, the system got exceptions. Why?
>
>For this problem, I have to remove the lines. But how to manage the memory
>of xmlStr?
>
>Best regards,
>Bing
>
>On Fri, May 20, 2011 at 11:19 PM, Evadne Wu
><email@hidden>wrote:
>
>> Hi Bing,
>>
>> Re-factored this method a bit to try out some idea have a look? It¹s
>> almost certainly asking for trouble to pass C strings around if you¹re
>> working with Cocoa, but I am not sure of your scenario, so maybe I am
>> (what¹s assumed to almost always be true) wrong with returning an
>>NSString.
>>
>>
>> + (NSString *) signInMessageWithPeerKey:(NSString *)aKey name:(NSString
>> *)aName password:(NSString *)aPassword {
>>
>> NSParameterAssert(aKey && aName && aPassword);
>>
>> NSXMLNode *rootNode = [NSXMLNode
>> elementWithName:MessageConstants.XML.MESSAGE_ROOT children:[NSArray
>> arrayWithObjects:
>>
>> [NSXMLNode elementWithName:MessageConstants.XML.PEERKEY
>> stringValue:aKey],
>> [NSXMLNode elementWithName:MessageConstants.XML.PEERNAME
>> stringValue:aName],
>> [NSXMLNode elementWithName:MessageConstants.XML.PASSWORD
>> stringValue:aPassword],
>>
>> nil] attributes:nil];
>>
>> NSXMLDocument *document = [[[NSXMLDocument alloc]
>> initWithRootElement:rootNode] autorelease];
>> [document setVersion:MessageConstants.XML.XML_VERSION];
>> [document setCharacterEncoding:MessageConstants.XML.XML_ENCODING];
>>
>> return [[[NSString alloc] initWithData:[document
>> XMLDataWithOptions:NSXMLNodePrettyPrint] encoding:[document
>> characterEncoding]] autorelease];
>>
>> }
>>
>>
>> -ev
>>
>> On May 20, 2011, at 22:43, Bing Li wrote:
>>
>> > Dear Jeff and all,
>> >
>> > I appreciate so much for your help! After reading the document from
>> > apple.com, I changed my code as follows. It must be fine.
>> >
>> > Best regards,
>> > Bing
>> >
>> > + (const char *) CreateSignInMessage: (NSString *)peerKey PN:
>>(NSString
>> > *)peerName PW:(NSString *)password
>> > {
>> > NSXMLElement *root = [NSXMLNode
>> > elementWithName:MessageConstants.XML.MESSAGE_ROOT];
>> > NSXMLDocument *xmlDoc = [[NSXMLDocument alloc]
>> > initWithRootElement:root];
>> > [xmlDoc setVersion:MessageConstants.XML.XML_VERSION];
>> > [xmlDoc
>>setCharacterEncoding:MessageConstants.XML.XML_ENCODING];
>> >
>> > NSXMLElement *peerKeyElement = [NSXMLNode
>> > elementWithName:MessageConstants.XML.PEERKEY];
>> > [root addChild:peerKeyElement];
>> > [peerKeyElement addChild:[NSXMLNode
>>textWithStringValue:peerKey]];
>> >
>> > NSXMLElement *peerNameElement = [NSXMLNode
>> > elementWithName:MessageConstants.XML.PEERNAME];
>> > [root addChild:peerNameElement];
>> > [peerNameElement addChild:[NSXMLNode
>> textWithStringValue:peerName]];
>> >
>> > NSXMLElement *passwordElement = [NSXMLNode
>> > elementWithName:MessageConstants.XML.PASSWORD];
>> > [root addChild:passwordElement];
>> > [passwordElement addChild:[NSXMLNode
>> textWithStringValue:password]];
>> >
>> > NSData *data = [xmlDoc
>>XMLDataWithOptions:NSXMLNodePrettyPrint];
>> > NSString *xmlStr = [[NSString alloc] initWithData:data
>> > encoding:NSUTF8StringEncoding];
>> > const char *xmlChar = [xmlStr UTF8String];
>> >
>> > /*
>> > [passwordElement release];
>> > [root release];
>> > [xmlStr release];
>> > [data release];
>> > */
>> > [xmlDoc release];
>> > [xmlStr autorelease];
>> > return xmlChar;
>> > }
>> >
>> >
>> > On Thu, May 19, 2011 at 4:23 PM, Jeffrey Walton <email@hidden>
>> wrote:
>> >
>> >> On Wed, May 18, 2011 at 2:16 PM, Ken Thomases <email@hidden>
>> wrote:
>> >>> On May 18, 2011, at 12:55 PM, Bing Li wrote:
>> >>>
>> >>>> NSXMLElement *root = [NSXMLNode
>>elementWithName:"MessageRoot"];
>> >>>
>> >>> As per Cocoa's memory management conventions, you don't not own the
>> >> object returned by -[NSXMLNode elementWithName:]. You have not
>>invoked
>> a
>> >> method whose name contains "alloc", "new", or "copy" or which is
>> explicitly
>> >> documented as giving its caller ownership rights and
>>responsibilities.
>> >>>
>> >>>> NSXMLElement *peerKeyElement = [NSXMLNode
>> >> elementWithName:"PeerKey"];
>> >>>
>> >>> Same here.
>> >>>
>> >>>> NSXMLElement *peerNameElement = [NSXMLNode
>> >> elementWithName:"PeerName"];
>> >>>
>> >>> Same here.
>> >>>
>> >>>> NSXMLElement *passwordElement = [NSXMLNode
>> >> elementWithName:"Password"];
>> >>>
>> >>> Same here.
>> >>>
>> >>>> NSData *data = [xmlDoc
>>XMLDataWithOptions:NSXMLNodePrettyPrint];
>> >>>
>> >>> Same here.
>> >>>
>> >>>> [passwordElement release];
>> >>>> // [peerNameElement release];
>> >>>> // [peerKeyElement release];
>> >>>> [root release];
>> >>>> [xmlDoc release];
>> >>>> [xmlStr release];
>> >>>> [data release];
>> >>>
>> >>> Many of these releases are wrong, not just the ones you have
>>commented
>> >> out.
>> >>> Of these, you only own xmlDoc and xmlStr, so those are the only ones
>> you
>> >> are
>> >>> entitled to release. If you didn't happen to get exceptions from
>> >> releasing the
>> >>> others, it was an unhappy accident. (Unhappy because it hid your
>>bug.
>> >> It is
>> >>> always better for bugs to be found early.)
>> >> If it helps Bing (and coming from someone who frequently needs the
>> >> same sort of help): (1) Run you code using Instruments, or (2) select
>> >> Executable -> Arguments and add NSZombieEnabled = YES. Both should
>> >> help you flush out the problems early (as Ken suggests).
>> >>
>> >>> Please review the Memory Management Programming Guide <
>> >>
>>
>>http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Mem
>>oryMgmt/
>> >.
>> >> It explains all of this.
>> >>>
>> >> Also grab a book or two. It will help you digest it. Nuremberg's book
>> >> would be a good choice since the doctor stays active on this list.
>> >>
>> >> Jeff
>> >>
>> > _______________________________________________
>> >
>> > 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
>>
>>
>_______________________________________________
>
>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:
>s.com
>
>This email sent to email@hidden
_______________________________________________
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