Here are some guidelines and macros for using designated initializers in objective-c.

Basically you pick your own initializer as the designated one. And the assumption is that it will call it’s parent when initializing.

If you have many convenience initializers, they should all come down to one main initializer. You can make that one up with the NS_DESIGNATED_INITIALIZER macro also.

Header.h

@interface Foo : NSObject

/**
* Initializes a new user API.
*
* @discussion This is the designated initializer.
*
* @param client A client responsible for sending and receiving messaging to Spotify app.
*/
- (instancetype)initWithClient:(Client *)client NS_DESIGNATED_INITIALIZER;

#pragma mark Unavailable Initializers

- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

Implementation.m

@implementation SPTAppRemoteUserAPIImplementation

- (instancetype)initWithClient:(Client *)client
{
   self = [super init];
   if (self) {
       _client  = client;
   }
   return self;
}