什么原因导致类别(Category)实现了一个也将被其主要类(primary class)实现的方法?

9

我的另一位程序员从网络上下载了这段代码

#import "UIImage+Alpha.h"

// Private helper methods
@interface UIImage ()
- (CGImageRef)newBorderMask:(NSUInteger)borderSize size:(CGSize)size;
@end

@implementation UIImage (Alpha)

我遇到了错误: 导致“Category”实现一个方法,而这个方法也将被其主要类实现的原因是什么?

我在我的所有文件中搜索newBorderMask,这个词只出现了3次。

它只声明了一次,即在

@interface UIImage ()
- (CGImageRef)newBorderMask:(NSUInteger)borderSize size:(CGSize)size;
@end

实现一次即在

#pragma mark -
#pragma mark Private helper methods

// Creates a mask that makes the outer edges transparent and everything else opaque
// The size must include the entire mask (opaque part + transparent border)
// The caller is responsible for releasing the returned reference by calling CGImageRelease
- (CGImageRef)newBorderMask:(NSUInteger)borderSize size:(CGSize)size1 {
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

并且只被调用一次

 CGImageRef maskImageRef = [self newBorderMask:borderSize size:newRect.size];

因此没有重复声明。

那么问题在哪里呢?

3个回答

27

我是代码的原作者,Aadhira的答案是不正确的。这个方法的类别名称不应更改为“Alpha”,因为该方法旨在是私有的,而不是扩展的一部分。

为了消除警告,最好的解决方法是给私有类别一个唯一的名称,例如“PrivateAlpha”。

有关详细信息,请参见此讨论


我目前正在使用这个库(非常感谢,感谢,感谢),并在尝试消除警告时发现了这个问题。您留下该警告的原因是什么? - marko
我将类扩展注释掉后,所有的警告都消失了。看起来分类名称不是问题的原因。 - jAckOdE

11

看到了吗,当你声明一个类时,它就像是...

@interface UIImage ()

但在实现上,它就像...

@implementation UIImage (Alpha)

那么请按以下方式声明:

@interface UIImage (Alpha)

我想我知道那个人为什么这样做了。@interface UIImage (alpha) 在.h文件中。 - user4951

5

我刚刚从我的.m文件中删除了整个部分:

@interface UIImage ()
- (CGImageRef)newBorderMask:(NSUInteger)borderSize size:(CGSize)size;
@end

LLVM 4.1编译器似乎不再关心它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接