On 11 Jul 2025, at 14:17, Riccardo Mottola <riccardo.mott...@libero.it> 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


Reply via email to