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