我正在开发一个iOS应用程序的插件。 我正在编译成.a文件,然后由主xcode项目使用。 到目前为止,我已经在这个库中创build了一个UIDevice类的类。 当我使用这个库运行主项目时,由于无法识别的select器而崩溃 – [UIDevice平台]:无法识别的select器发送到实例 平台是我通过类添加的function之一。 所以我认为它根本就没有链接这些函数,并将ac函数添加到与UIDevice类别相同的文件,然后从我的代码中调用它。 这次主项目运行良好…所以我想也许这是我做的其他事情,并删除了C函数。 但是,看到它由于无法识别的select器再次坠毁。 我的问题:为什么xcode忽略类别定义,除非我调用在同一个文件中声明的函数? 是否有一个Xcode设置,我可以改变,使其包括UIDevice类别的这些方法,无论我是否从该文件调用函数? 干杯
在Objective-C中,我可以将方法添加到具有类别的现有类中,例如 @interface NSString (MyCategory) – (BOOL) startsWith: (NSString*) prefix; @end 是否也可以用协议来做到这一点,即如果有一个NSString协议,如下所示: @interface <NSString> (MyCategory) – (BOOL) startsWith: (NSString*) prefix; @end 我想这样做,因为我有几个扩展到NSObject(类),只使用公共NSObject方法,我希望这些扩展也可以使用实现协议的对象。 举个更进一步的例子,如果我想编写一个方法logDescription,将对象的描述打印到日志中,该怎么办: – (void) logDescription { NSLog(@"%@", [self description]); } 我当然可以将此方法添加到NSObject,但也有其他类不从NSObjectinheritance,我也想要这种方法,例如NSProxy。 由于该方法只使用协议的公共成员,所以最好将其添加到协议中。 编辑:Java 8现在有这样的“虚拟扩展方法”的接口: http : //cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf 。 这正是我想在Objective-C中做的事情。 我没有看到这个问题引起了这么多的关注。 问候,乔臣
使用JUnit 4.8和新的@Category注解,有没有办法selectMaven的Surefire插件运行的类别的子集? 例如,我有: @Test public void a() { } @Category(SlowTests.class) @Test public void b() { } 我想运行所有非慢速testing,如下所示(注意-Dtest.categories由我组成)。 mvn test -Dtest.categories=!SlowTests // run non-slow tests mvn test -Dtest.categories=SlowTests // run only slow tests mvn test -Dtest.categories=SlowTests,FastTests // run only slow tests and fast tests mvn test // run all tests, including non-categorized 所以问题是我不想创buildtesting套件(Maven只是在项目中拿起所有的unit testing非常方便),我希望Maven能够按类别selecttesting。 我想我只是编写了-Dtest.categories,所以我想知道是否有类似的设施可以使用?
我的项目有一个UIImage类别的function,我想从另一个class级调用。 我正确地导入图像类别的头文件,我得到的项目编译没有任何警告。 问题是,当我调用UIImage类别函数,我看到一个无法识别的select器错误与NSInvalidArgumentException 。 为什么我看到这个,如果我已经正确地链接了一切? #import <UIKit/UIKit.h> @interface UIImage (DRShare) + (UIImage*) imageNamed:(NSString*)name; @end @implementation UIImage (DRShare) + (UIImage*) imageNamedDR:(NSString*)name{ CGFloat s = 1.0f; if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]){ s = [[UIScreen mainScreen] scale]; } NSString *path = [NSString stringWithFormat:@"%@%@%@.png",kImagesPath,name,s > 1 ? @"@2x":@""]; return [UIImage imageWithContentsOfFile:DRBUNDLE(path)]; } @end 调用它的文件: backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamedDR:@"Share Popup […]
如果我在一个类别实现中使用objc_setAssociatedObject / objc_getAssociatedObject在setter方法中存储模拟的实例variables,我将如何访问getter方法中的键,因为在setter方法中声明的任何variables将超出getter方法的范围? 编辑:澄清,如果我要使用以下模式,我应该在哪里申报STRING_KEY,以便我可以在setter和getter方法中使用它。 @interface NSView (simulateVar) -(void)setSimualtedString:(NSString *)myString; -(NSString *)simulatedString; @end @implementation NSView (simulateVar) -(void)setSimualtedString: (NSString *)myString { objc_setAssociatedObject(self, &STRING_KEY, myString, OBJC_ASSOCIATION_RETAIN); } -(NSString *)simulatedString { return (NSString *)objc_getAssociatedObject(self, &STRING_KEY); } @end
我有一个关于NSDate的类别,如果它可以实现我以前创build的协议将是方便的。 这可能吗? 这是什么正确的语法?
我想在NSObject实例上使用select器, 而不需要实现的协议。 例如,有一个类别方法应该设置一个错误属性,如果它调用的NSObject实例支持它。 这是代码,代码按预期工作: if ([self respondsToSelector:@selector(setError:)]) { [self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]]; } 但是,编译器没有看到setError:signature的任何方法,所以它给了我一个警告,对于包含@selector(setError:)片段的每一行: Undeclared selector 'setError:' 我不想宣布一个协议来摆脱这个警告,因为我不希望所有可能使用这个类的类实现任何特殊的东西。 按照惯例我希望他们有一个setError:方法或属性。 这是可行的吗? 怎么样? 干杯, EP
有人可以向我解释目标C中类别和inheritance之间的区别吗? 我已阅读维基百科的条目,关于类别的讨论与inheritance没有任何区别。 我也在“开放iPhone开发”一书中讨论了这个话题的讨论,但我仍然不明白。
我可以使用类别来覆盖已经使用类别实现的方法吗? 喜欢这个: 1)原始方法 -(BOOL) method { return true; } 2)重写方法 -(BOOL) method { NSLog(@"error?"); return true; } 这工作,或者这是非法的?
你能指导我如何正确地链接静态库到iPhone项目。 我使用静态库项目添加到应用程序项目作为直接依赖项(目标 – >一般 – >直接依赖项),所有工作正常,但类别。 在静态库中定义的类别不适用于应用程序。 所以我的问题是如何将静态库与一些类别添加到其他项目? 一般来说,在其他项目的应用项目代码中使用什么是最佳实践?