Objective c 目标-c类别

Objective c 目标-c类别,objective-c,categories,Objective C,Categories,我正在学习Objective-C,现在我被分类束缚住了。这是密码 #import <Foundation/Foundation.h> @interface NSMutableArray (NSMutableArrayCategory) -(NSMutableArray *)removeLastObject; @end #import "NSMutableArrayCategory.h" @implementation NSMuta

我正在学习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

这里怎么了?

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

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

删除项目后返回自我。

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

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

删除项后返回self..

您可能希望将
removeLastObject
声明为返回
void
,而不是
NSMutableArray

@interface NSMutableArray (NSMutableArrayCategory)

- (void)removeLastObject;

@end
然后实现将如下所示:

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

这与
NSMutableArray
上的其他变异方法相匹配您可能希望将
removeLastObject
声明为返回
void
,而不是
NSMutableArray

@interface NSMutableArray (NSMutableArrayCategory)

- (void)removeLastObject;

@end
然后实现将如下所示:

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

这与
NSMutableArray

上的其他变异方法相匹配。根本的问题是
removeLastObject
已经定义好了,并且做了您想要的事情(因此人们不会重新创建它)。然而,这里的一些答案有点让人困惑,因为它们建议可以使用一个类别来覆盖现有的方法(或者至少不要明确声明您不能这样做)。你不能这样做。它是定义不清的行为,在某些情况下,它是完全未定义的行为。您通常应该使用子类来重写方法

@interface NSMutableArray (NSMutableArrayCategory)

- (void)removeLastObject;

@end
有一种叫做swizzling的高级技术,它允许您在不使用子类的情况下执行此操作,但它是一种非常专门的技术,有时是脆弱的技术,不适用于一般用途


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

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

有一种叫做swizzling的高级技术,它允许您在不使用子类的情况下执行此操作,但它是一种非常专门的技术,有时是脆弱的技术,不适用于一般用途


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

我不熟悉objective c。但我认为removeObjectAtIndex返回void。所以我会尝试[self-removeObjectAtIndex:[self count]-1];回归自我;我对目标c不熟悉。但我认为removeObjectAtIndex返回void。所以我会尝试[self-removeObjectAtIndex:[self count]-1];回归自我;当然,如果要在Apple类上创建category方法,可能需要以某种方式对其命名。例如,类似于
removeLastObject_joh
,以确保它不会与将来在私有或其他类别中定义的某个方法冲突。您肯定希望在此处对其进行不同的调用,因为
removeLastObject
已经存在exists@JeremyP呃,对!!那也是!当
[self count]
==0:)时,它也不会引发异常。当然,如果您在Apple类上创建一个category方法,您可能希望以某种方式命名它。例如,类似于
removeLastObject_joh
,以确保它不会与将来在私有或其他类别中定义的某个方法冲突。您肯定希望在此处对其进行不同的调用,因为
removeLastObject
已经存在exists@JeremyP呃,对!!那也是!当
[self count]
==0:)时,它也不会引发异常