1

我正在学习 Objective-C,现在我被类别困住了。这是代码

#import <Foundation/Foundation.h>


    @interface NSMutableArray (NSMutableArrayCategory)

    -(NSMutableArray *)removeLastObject;

    @end

    #import "NSMutableArrayCategory.h"


    @implementation NSMutableArray (NSMutableArrayCategory)

    -(NSMutableArray *)removeLastObject
    {
       return [self removeObjectAtIndex:[self count] - 1];
    }
    @end

问题是我得到

Returning void from a function with incompatible result type 'NSMutableArray' *

这里有什么问题?

4

3 回答 3

4

您可能想声明removeLastObject为返回void,而不是NSMutableArray

@interface NSMutableArray (NSMutableArrayCategory)

- (void)removeLastObject;

@end

然后实现将如下所示:

- (void)removeLastObject
{
   [self removeObjectAtIndex:[self count] - 1];
}

这与 上的其他突变方法相匹配NSMutableArray

于 2012-08-06T14:30:36.293 回答
2

潜在的问题是removeLastObject已经定义并且可以做你想做的(所以人们不会重新创建它)。然而,这里的一些答案有点令人困惑,因为他们建议使用类别来覆盖现有方法是可以的(或者至少不要明确声明您不能这样做)。你不能这样做。这是定义不明确的行为,在某些情况下是完全未定义的行为。您通常应该子类化以覆盖方法。

有一种称为 swizzling 的高级技术可以让您在没有子类的情况下执行此操作,但它是一种非常专业且有时很脆弱的技术,不适用于一般用途。

但在任何情况下,您都不应该使用类别来覆盖现有方法。

于 2012-08-06T14:34:43.013 回答
0

我不熟悉目标c。但我想 removeObjectAtIndex 返回 void。所以我会尝试

[self removeObjectAtIndex:[self count] -1]; 
return self;

删除项目后返回自我..

于 2012-08-06T14:29:03.743 回答