How to write an Objective-C convenience constructor

后端 未结 2 1978
我寻月下人不归
我寻月下人不归 2021-02-04 03:34

I\'m trying to add a convenience constructor to my custom object. Similar to [NSArray arrayWithArray:]

I know it involves a class method that returns an au

相关标签:
2条回答
  • 2021-02-04 03:53

    Let's say you have the following:

    @class PotatoPeeler : NSObject
    - (instancetype)initWithWidget: (Widget *)w;
    @end
    

    Then to add a factory method, you'd change it to this:

    @class PotatoPeeler : NSObject
    + (instancetype)potatoPeelerWithWidget: (Widget *)w;
    - (instancetype)initWithWidget: (Widget *)w;
    @end
    

    And your implementation would simply be:

    + (instancetype)potatoPeelerWithWidget: (Widget *)w {
        return [[[self alloc] initWithWidget: w] autorelease];
    }
    

    Edit: replaced id with instancetype. They are functionally identical, but the latter provides better hints to the compiler about the method's return type.

    0 讨论(0)
  • 2021-02-04 03:57

    Generally my approach is the following: first I create a normal initializer method (instance method), then I create a class method that calls the normal initializer. It seems to me Apple uses the same approach most of the time. An example:

    @implementation SomeObject
    
    @synthesize string = _string; // assuming there's an 'string' property in the header
    
    - (id)initWithString:(NSString *)string 
    {
       self = [super init];
       if (self)
       {
          self.string = string;
       }
       return self;
    }
    
    + (SomeObject *)someObjectWithString:(NSString *)string
    {
       return [[[SomeObject alloc] initWithString:string] autorelease];
    }
    
    - (void)dealloc
    {
       self.string = nil;
    
       [super dealloc];
    }
    
    @end
    
    0 讨论(0)
提交回复
热议问题