In GNUstep base this method is implemented in this way:
+ (NSCharacterSet*) characterSetWithCharactersInString: (NSString*)aString
{
NSMutableCharacterSet *ms;
NSCharacterSet *cs;
ms = [NSMutableCharacterSet new];
[ms addCharactersInString: aString];
cs = [ms copy];
RELEASE(ms);
return AUTORELEASE(cs);
}
And copy will result in a non mutable character set. But from this method you
also see what you should have used in the first place, just the first two lines
of this method :-)
Hope this helps,
Fred
> Am 11.07.2025 um 16:35 schrieb David Chisnall <[email protected]>:
>
> On 11 Jul 2025, at 14:17, Riccardo Mottola <[email protected]> wrote:
>>
>> Hi,
>>
>> In Grr there is this code:
>>
>> wsAndTagClosing = [NSMutableCharacterSet
>> characterSetWithCharactersInString: @"/>"];
>>
>> Clang warns me with:
>>
>> NSString+TolerantHTML.m:109:21: warning: incompatible pointer types
>> assigning to 'NSMutableCharacterSet *' from 'NSCharacterSet *'
>> [-Wincompatible-pointer-types]
>> 109 | wsAndTagClosing = [NSMutableCharacterSet
>> characterSetWithCharactersInString: @"/>"];
>>
>> GCC gives a more generic issue about "distinct objective C type".
>>
>> Now, characterSetWithCharactersInString: is a class method of
>> NSCharacterSet:
>>
>> https://www.gnustep.org/resources/documentation/Developer/Base/Reference/NSCharacterSet.html#method$NSCharacterSet+characterSetWithCharactersInString$
>>
>> and NSMutableCharacterSet is a subclass of NSCharacterSet
>>
>> Shouldn't thus the method called on the subclass still return a valid
>> subclass and not the superclass?
>>
>> Could it be a header issue? we define it as:
>> + (NSCharacterSet*) characterSetWithCharactersInString: (NSString*)aString;
>>
>> maybe it should return instancetype?
>
> Factory methods on the superclass, if called on the subclass, are not
> required to return an instance of the subclass, they can return a totally
> unrelated subclass. For example, a bunch of the NSString and NSDictionary
> factory methods will return a specialised version for small of arguments. If
> you’re doing this kind of trick, you need an explicit check in the method
> implementation to see if `self` is the expected class.
>
> If that check exists, or if this method isn’t returning a subclass instance,
> it’s safe to turn it into instancetype and this warning will go away. If
> not, then this is a real warning and the mutable subclass is not being
> returned.
>
> You can also try `NSLog(@“What even is this? %@“, [wsAndTagClosing class]);`
> to see.
>
> David