0

У меня есть категория «NSObject + completeOnce». И я использую его для основного приложения, просмотра, виджета. Но я не добавил его в чат и цель виджета. Конечно, я должен это сделать.Нет предупреждений, если категория используется, но не добавляется в цель (любой способ проверить ее автоматически?)

Мой вопрос: «Почему я не вижу никаких предупреждений или ссылок на ошибки в этом случае? Могу ли я их заставлять?» У меня есть более 100 классов в моем проекте, а иногда делаю такой mitakes :(Было бы хорошо, чтобы найти какой-нибудь способ, чтобы проверить его, прежде чем запущенный

Категории декларация:.

//Category is added only into main target. 
@interface NSObject (completeOnce) 
+ (void)completeBlockOnce:(void(^)(void))block forKey:(NSString*)key 
@end 

Использование:

@implementation SomeOtherClass 
+ (void)method 
{ 
    //It crashes for for widgets. 
    //And Here is no any warnings. Also no linking errors at all 
    [NSObject completeBlockOnce:^{ 
     //Some Code 
    } forKey:@"FixMigrationBug_1_0_to_1_6"]; 
} 
@end 

Я уверен, что у меня есть только одно объявление этого метода. И я должен подчеркнуть, что это та же проблема для всех категорий. Даже для категорий моих пользовательских классов с уникальным именем метода 99%.

enter image description here

+1

Какие методы определены в этой категории? Вы уверены, что они не конфликтуют с другими существующими именами? Как выглядят сайты вызовов этих методов? –

+0

Спасибо за внимание, я добавил некоторую информацию. Думаю, он содержит ответы на ваши вопросы. – ZevsVU

+1

Спасибо за информацию. Таким образом, основная проблема заключается в том, что вы импортируете заголовки на всех платформах, но когда вы не включаете фактический скомпилированный '.m' для этих целей, они вылетают, исправляются? Если это так, то я предполагаю, что вы не получаете ошибку компилятора, потому что у компилятора есть все, что нужно в файлах заголовка: объявление метода. Компилятору все равно, есть ли этот метод или нет, просто нужно посмотреть, как он выглядит. (До компоновщика, чтобы проверить.) Линкер, возможно, не сможет статически определить этот материал, так как он находится в категории - это зависит от времени выполнения. –

ответ

2

Что вы видите, это сложная проблема. Вы правы в поиске двух типов ошибок - предупреждений/ошибок компилятора и ошибок компоновщика. Вы тоже не получаете по двум причинам:

  1. На самом деле нет никакой причины для компилятора давать вам предупреждение. Весь компилятор для того, чтобы вы могли вызвать вызов метода, - это объявление метода (для правильного согласования аргументов, предотвращения общей ошибки пользователя и т. Д.). На самом деле не нужно знать, что метод каким-то образом будет связан; это работа линкера. В этом случае, поскольку вы объявляете методы в заголовке и включаете заголовок, компилятор удовлетворен, и вы не получите предупреждения, поскольку в отношении компилятора метод будет существовать позже.
  2. Компилятор не дает ошибку для отсутствующих методов, потому что Objective-C does not produce linker symbols for methods (см. Заголовок Objective-C на этой странице). Objective-C по сути является очень динамичным языком, поэтому невозможно узнать, что будет делать конкретный вызов метода до выполнения; на самом деле, можно определить методы во время выполнения, которые не существуют статически. Для компоновщика требуется только информация о классе, которую она имеет; оценка методов остается до времени выполнения.

Эти две вещи в совокупности приводят к поведению, которое вы видите. Единственный способ убедиться в том, что эти методы не существуют, - это просто попытаться вызвать их во время выполнения - где теперь вы получаете исключение (если оно не показано, приводит к сбою), поскольку они фактически не были включены в бинарном приложении.

+0

Я думаю, что ты прав. Но я ищу способ избежать подобных сбоев в будущем.Может быть, решения нет. Но я думаю, что я должен хотя бы попробовать. Потому что я работаю с «виджетами» и «Apple watch». В проекте есть 1000 + файлов. И я не могу проверить это сам = (. Такие ошибки появляются раз в месяц снова и снова, как этот человек с ложкой = (https://www.youtube.com/watch?v=9VDvgL58h_Y – ZevsVU

+0

Возможно, мое название вопроса не соответствует моим потребностям = (я постараюсь быть более точным в этом. – ZevsVU

+1

@ZevsVU Нет решения, поддерживаемого компилятором, потому что не может быть одного, по причинам выше - просто нет способа статически знать, будут ли методы там или нет. Однако вы можете решить эту проблему с помощью инструментария: вы можете написать сценарий, который автоматически проходит через все файлы в вашем проекте и гарантирует, что они будут добавлены ко всем целям. список файлов, которые должны быть на некоторых объектах, а не на других, добавляет их в соответствующие. –

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

  • Нет связанных вопросов^_^