Расширение класса в Prefix.pch больше не работает с xCode 4.2

#objective-c

#objective-c

Вопрос:

Я включил заголовок в свой файл prefix.pch таким образом:

 #import <Availability.h>

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif 

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import "Constants.h"
#endif
  

И во включенном заголовке есть расширения класса:

 @interface UIColor (MyApp)

 (UIColor *) myColor;
 (UIColor *) navColor;

@end

@implementation UIColor (MyApp)

 (UIColor *) myColor { return [UIColor colorWithRed:0 green:0.3 blue:0.7 alpha:1.0]; }
 (UIColor *) navColor { return [UIColor colorWithRed:0.3 green:0.1 blue:0.2 alpha:1.0]; }

@end
  

Который я затем вызывал в других файлах как таковой:

 [self.theTable setSeparatorColor:[UIColor myColor]];
  

Но после обновления до xCode 4.2 / iOS 5 теперь это приводит к сбою, говоря "Thread 1: Program received signal: "SIGABRT". в приведенной выше строке.

Это происходит всякий раз, когда я пытаюсь ссылаться на цвет, независимо от того, какой файл и какой контекст. У меня не было этой проблемы при работе с iOS 4.

Есть ли лучший способ расширить класс таким образом, чтобы он был доступен для всех файлов, или исправить вышеуказанную ошибку?

Большое спасибо,

Тим

Комментарии:

1. И где реализация [UIColor plColor] ?

2. Извините, Лукман, изменил код, чтобы сделать его универсальным, но забыл переименовать последний! сейчас отредактировал сообщение. Если бы только исправление было таким простым 🙂 (или это все еще может быть, кто знает)

Ответ №1:

Ваши объявления должны быть в заголовке:

 @interface UIColor (MyApp)

 (UIColor *) myColor;
 (UIColor *) navColor;

@end
  

и ваши определения должны быть в вашем .m:

 @implementation UIColor (MyApp)

 (UIColor *) myColor { return [UIColor colorWithRed:0 green:0.3 blue:0.7 alpha:1.0]; }
 (UIColor *) navColor { return [UIColor colorWithRed:0.3 green:0.1 blue:0.2 alpha:1.0]; }

@end
  

это не обязательно может быть причиной вашего SIGABRT, но ваш @implementation блок должен быть виден только одному переводу (удивлен, что он не выдал ошибку ссылки, если я не неправильно понял ваш вопрос).

Есть ли еще какие-либо причины сбоя программы?

Комментарии:

1. К такому выводу я пришел. Моим единственным камнем преткновения было то, почему это будет работать в 4. * а не в 5.0?

2. @NJones idk! как я уже сказал, я ожидал ошибки ссылки. ошибка ссылки — это то, что происходило в прошлом, и я даже не знал, что в какой-то момент несколько определений одного и того же метода objc были правильно сформированы (я все еще подозреваю, что это не так). возможно, это просто различия в clang?

3. Довольно простое решение! Не могу поверить, что я об этом не подумал. Только что где-то видел пример универсального заголовка онлайн, который включал оба в один файл, и это сработало, поэтому я не думал дважды об этом при его использовании. Затем, когда оно сломалось в новом обновлении, не приходило в голову, что это было в корне неправильно! Снова срабатывает очарование. Спасибо, ребята.