Objective c 目标-c类别
我正在学习Objective-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
#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:)时,它也不会引发异常