String manipulation without memory leaks?

前端 未结 3 679
抹茶落季
抹茶落季 2021-02-10 06:53

I\'d like to do a series of string substitutions to removed xml-escaped chars such as \'&\'.

1) Is there an existing UIKit function that can do thi

相关标签:
3条回答
  • 2021-02-10 07:17

    Any cocoa method which returns a new object via a method that does not start with init or contain the word copy will return an autoreleased object. So the above code should have noleaks.

    Although it may be easier to use a NSMutableString here. Then you just modify the string in place rather than creating a pile of autoreleased string objects, which should make things cleaner.

    Also, how about a dictionary of mappings that you iterate through, finding the key and replacing with the value of each item. Maybe even save this as a plist in your app for easy tweaking later.

    0 讨论(0)
  • 2021-02-10 07:18

    As Squeegy said, all of the above methods you reference return autoreleased objects. The second code example will crash because you are overreleasing the string objects.

    Squeegy pointed one way of handling this, using NSMutableStrings. I'd recommend that approach. For example, the following rewrite of your method:

    -(NSString*) unescape:(NSString*)string
    {
        NSMutableString *unescapedString = [[NSMutableString alloc] initWithString:string];
        [unescapedString replaceOccurrencesOfString:@"'" withString:@"'" options:0 range:NSMakeRange(0, [unescapedString length])];
        [unescapedString replaceOccurrencesOfString:@"&" withString:@"&" options:0 range:NSMakeRange(0, [unescapedString length])];
        [unescapedString replaceOccurrencesOfString:@""" withString:@"\"" options:0 range:NSMakeRange(0, [unescapedString length])];
        [unescapedString replaceOccurrencesOfString:@">" withString:@">" options:0 range:NSMakeRange(0, [unescapedString length])];
        [unescapedString replaceOccurrencesOfString:@"&lt;" withString:@"<" options:0 range:NSMakeRange(0, [unescapedString length])];
        return [unescapedString autorelease];
    }
    

    only returns an autoreleased NSMutableString at the end.

    Even better would be if you passed in a pointer to an NSMutableString pointer (NSMutableString **). That way, you could modify the string that you'd created outside of your method without creating a new temporary string. If this seems strange, take a look at methods that deal with NSError instances as an example.

    EDIT: Ignore my statement about needing a double pointer in the previous paragraph. As erikprice points out, you just need to pass in an NSMutableString pointer. The double pointer is only needed if you create a new NSMutableString instance in your method to replace the one being passed in, which is not the case here.

    0 讨论(0)
  • 2021-02-10 07:29

    I recommend you read the Cocoa memory management rules.

    0 讨论(0)
提交回复
热议问题