stringByAppendingPathComponent, hows it work?

前端 未结 6 1129
暗喜
暗喜 2021-01-04 22:37

EDIT_v002

I have had a look at all the comments and I am starting to see what I should be doing. To that end I have modified my code (see below) I have changed new

相关标签:
6条回答
  • 2021-01-04 22:53

    All the existing answers are leaking the original testPath string. For something as simple as this, why has nobody recommended -[NSMutableString appendString:] intead?

    [testPath appendString:@"/"];
    

    There's no equivalent to -stringByAppendingPathComponent: for NSMutableString, but it looks like he's just trying to add a slash, not a path component anyway. If you really wanted to add a path component, you could do this:

    [testPath setString:[testPath stringByAppendingPathComponent:@"..."]];
    

    It's an annoying workaround, but as @dreamlax points out, -stringByAppendingPathComponent: always returns an immutable string, even when called on an NSMutableString object. :-(

    0 讨论(0)
  • 2021-01-04 22:54

    The last line should be:

    testPath = [testPath stringByAppendingPathComponent:@"/"];
    
    0 讨论(0)
  • 2021-01-04 22:55

    -stringByAppendingPathComponent returns a new immutable string, it doesn't modify the original. You have to use the return value of this method.

    0 讨论(0)
  • 2021-01-04 22:59
    [testPath stringByAppendingString:@"/"]
    
    0 讨论(0)
  • 2021-01-04 23:07

    You don't append the delimiter. You append the next path component (eg filename, dir, etc). This avoids you needing to know the delimiter for your particular system.

    NSMutableString* mutablePath = [NSMutableString string];
    NSString* fullPath = [rootPath stringByAppendingPathComponent:filename];
    
    [mutablePath setString:fullPath]; // OK to setString: of Mutable with non-Mutable
    [mutablePath appendString:someOtherString]; // This won't cause an exception
    
    // Example to clarify on comments below
    {
        // This will cause a compiler warning.
        // warning: incompatible Objective-C types assigning
        //    ‘struct NSString *’, expected ‘struct NSMutableString *’
        NSMutableString* ms = [@"FOO" stringByAppendingPathComponent:@"BAR"];
    }
    

    There is a fairly clear example in the documentation.

    0 讨论(0)
  • 2021-01-04 23:11

    stringByAppendingPathComponent, hows it work?

    Simple. You want to append a path component. You send that message to the string you want to append a path component to, passing the path component you want to append.

    Path components are not the slashes; if they were, the pathComponents method would return nothing but an array of slashes. Path components are the parts between the slashes (although there is a special case, described in the definition of pathComponents).

    The slash is the path separator. This is hard-coded inside of Cocoa; it's currently (and likely to always be) a slash. So, if you really wanted to append a slash to a string, the most likely reason would be that you want to append a path separator, not a path component.

        [newPath setString:rootPath];
        [newPath appendString:@"/"];
        [newPath appendString:fileName];
    

    fileName is the component you want to add. Use stringByAppendingPathComponent: and pass fileName, not a slash.

    As for whether your example leaks: Well, does an object fall out of scope without getting released? The answer to that question is the answer to whether it's a leak. If you're not sure, review the memory management rules.

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