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 <monocerosfu...@gmail.com>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 <noloa...@gmail.com> > wrote: > > > >> On Wed, May 18, 2011 at 2:16 PM, Ken Thomases <k...@codeweavers.com> > 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/MemoryMgmt/ > >. > >> 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 (Cocoa-dev@lists.apple.com) > > > > 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: > > http://lists.apple.com/mailman/options/cocoa-dev/ev%40monoceroi.com > > > > This email sent to e...@monoceroi.com > > _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com