How to use string constants correctly I often get into the dilemma of how to use string constants, this is the way I use now:
UIImage *image = [UIImage imageNamed:@&quot;apple.png&quot;];
NSArray *imageNames = @[@&quot;apple01.png&quot;,@&quot;apple02.png&quot;];    
NSDictionary *imageKeyValues = @{@&quot;Avatar&quot; : @&quot;apple.png&quot;};

Once I encounter this type of code, I often use string pointers to refactor, because I don't know what the string code means:
static NSString *appleImage = @&quot;apple.png&quot;;
UIImage *image = [UIImage imageNamed:appleImage];

NSArray *imageNames = @[@&quot;apple01.png&quot;,@&quot;apple02.png&quot;];

static NSString  *avatarKey = @&quot;Avatar&quot;;
NSDictionary *imageKeyValues = @{avatarKey : appleImage};

My question now is: Should I assign each string to a variable? Many strings are not shared and will only be used once. Is it worth modifying like this? Is there a better way?
You ask:

Should I assign each string to a variable? Many strings are not shared and will only be used once.

Obviously, in the other case, where the string is reused/shared, then of course one would (and should) define the constant/pointer once rather than ever repeating the same string literal in multiple places. This makes code easier to maintain.
You might also use constants/pointer to centralize the definition of all the possible keys in one place. E.g. if the string literals define possible key names used in some web interface, we might want to put all these key names in one place, making it easier to keep track of the API.
But if the strings are not shared and there is no organizational benefit to centralizing these definitions, then no, one would not assign each string its own variable.

Is it worth modifying like this?

If you are asking whether you should convert this ...
- (UIImage *)appleImage {
    UIImage *image = [UIImage imageNamed:@&quot;apple.png&quot;];
    return image;
}

... to the following ...
- (UIImage *)appleImage {
    static NSString *name = @&quot;apple.png&quot;;
    UIImage *image = [UIImage imageNamed:name];
    return image;
}

... then the answer is, no, there is little benefit in doing do.
I would advise against pulling the string literal into its own local NSString pointer just for the sake of it. It just adds syntactic noise in this case. Yes, there are cases where one might pull the literal into its own line for the sake of clarity, but that not is not the case here.
The governing principles are code maintainability and readability.