2015-03-30 2 views
4

Этот код является модифицированной версией Закаленного словаря, реализованной здесь. https://github.com/nicklockwood/OrderedDictionary/tree/master/OrderedDictionaryНазначенный инициализатор должен вызывать только назначенный инициализатор на 'super'

Интерфейс -> OrderedDictionary.h

@interface OrderedDictionary : NSMutableDictionary 
{ 
} 

Реализация -> OrderedDictionary.m

// This is the new method added. 
- (instancetype)init 
{ 
    return [self initWithCapacity:0]; 
} 

- (instancetype)initWithCapacity:(NSUInteger)capacity 
{ 
    self = [super init]; 
    if (self != nil) 
    { 
     // Allocate here. 
    } 
    return self; 
} 

код работает отлично, но я получаю следующие предупреждения в «- (instancetype)в этом".

  1. Место инициализатор должен вызывать только назначенный инициализатору на «супер»
  2. Места инициализатор отсутствует вызов «супер» к назначенному инициализатору супер класса

Что я делаю неправильно и как я могу это исправить?

внесены следующие изменения в код, чтобы решить эту проблему

// This is the new method added. 

- (instancetype)init 
{ 
    self = [super init]; 
    if (self != nil) 
    { 
     // Allocate here. 
    } 
    return self; 
} 

- (instancetype)initWithCapacity:(NSUInteger)capacity 
{ 
    self = [super initWithCapacity:capacity]; 
    if (self != nil) 
    { 
     // Allocate here. 
    } 
    return self; 
} 
+0

Хотя @ KirkSpaziani Ответим сделал трюк, то [IOS Разработка библиотеки Инициализация объекта] (https://developer.apple.com/library/prerelease/ios/releasenotes/ObjectiveC/ModernizationObjC/AdoptingModernObjective-C/AdoptingModernObjective-C. html # // apple_ref/doc/uid/TP40014150-CH1-SW8) добавляет некоторые подробности. –

ответ

1

Как вы можете прочитать в NSMutableDictionary documentation, есть два обозначены инициализатор для этого класса:

  • initWithCapacity: Места Initializer
  • init Места Initializer

Здесь вы звоните из initWithCapacity в своем классе to super.init. Вот почему компилятор предупреждает вас.

Этот код может быть лучше:

// This is the new method added. 
- (instancetype)init 
{ 
    return [self initWithCapacity:0]; 
} 

- (instancetype)initWithCapacity:(NSUInteger)capacity 
{ 
    self = [super initWithCapacity:capacity]; 
    if (self != nil) 
    { 
     // Allocate here. 
    } 
    return self; 
} 
+0

Это не исправить проблему, но благодаря этому я понял, что случилось. Благодарю. – Vishvesh

+4

Если это не решило проблему, вы не должны принимать ответ как правильный. –

3

попробуйте добавить - (instancetype) initWithCapacity: (NSUInteger) емкости NS_DESIGNATED_INITIALIZER;

К блоку @interface. Все пути инициализации должны проходить через назначенный инициализатор - в вашем случае initWithCapacity: это очевидный выбор, поскольку init вызывает его. Вы все еще можете столкнуться с проблемами, назначенный инициализатор должен вызывать инициализатор суперкласса. Если суперкласс определяет назначенные инициализаторы, то они также должны быть реализованы вашим классом ...

В общем подклассе NSMutableDictionary считается плохой практикой, потому что NSMutableDictionary является публичным элементом кластера классов. Это может быть частью причины предупреждений компилятора.

+0

Это зафиксировало предупреждения, с которыми я столкнулся, но ввел новую информацию о «initWithCoder». Было хорошо знать этот вариант. Спасибо – Vishvesh

0

Вы должны назвать только супер вашей собственной функции.

Так заменить

self = [super init]; 

с

self = [super initWithCapacity:capacity]; 
+1

Это неправда - вся инициализация должна проходить через назначенный инициализатор текущего класса. – KirkSpaziani

0

я бы поставил некоторые из вас споткнуться это предупреждение, когда у вас есть Xcode преобразовать код в "Modern Objective-C Синтаксис".

Я видел случаи, когда файлы заголовки Objective-C были изменены конвертером, чтобы иметь два назначенные инициализаторы:

- (instancetype) init NS_DESIGNATED_INITIALIZER;         // DO NOT USE 
- (instancetype) initWithFileset: (NSArray *) fileset NS_DESIGNATED_INITIALIZER; // use this to instantiate 

Если изменить этот код к одному инициализатору, вы можете найти предупреждающее сообщение уходит:

- (instancetype) init;                // DO NOT USE 
- (instancetype) initWithFileset: (NSArray *) fileset NS_DESIGNATED_INITIALIZER; // use this to instantiate 

Вкратце, проверьте заголовок и исходный файл, когда увидите это предупреждающее сообщение.

Смежные вопросы