2012-08-06 37 views
1

我正在學習Objective-C,現在我被困在類別中。下面是代碼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' * 

這裏有什麼問題?

+0

我不熟悉目標c。但我想象removeObjectAtIndex返回void。所以我會嘗試[self removeObjectAtIndex:[self count] -1];迴歸自我; – WraithNath 2012-08-06 14:27:34

回答

4

你可能想聲明removeLastObject爲返回void,不NSMutableArray

@interface NSMutableArray (NSMutableArrayCategory) 

- (void)removeLastObject; 

@end 

然後實施,將是這樣的:

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

這其他突變方法相匹配的NSMutableArray

+0

當然,如果你在Apple類上做類別方法,你可能想要以某種方式命名空間。例如,像'removeLastObject_joh'這樣的東西可以確保它不會與將來定義的一些方法(私人或其他類別)發生衝突。 – 2012-08-06 14:32:41

+0

因爲'removeLastObject'已經存在,所以你一定要在這裏稱它爲不同的東西 – JeremyP 2012-08-06 15:06:05

+0

@JeremyP呃,對!那個也是!當'[self count] == 0時,它也不會引發異常:) – 2012-08-06 15:07:43

0

我不熟悉目標c。但我想象removeObjectAtIndex返回void。所以我會嘗試

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

迴歸自我刪除的項目以後。

2

的根本問題是removeLastObject已經定義和你想要做什麼(所以人們不重新創建它)。但是,這裏的一些答案有點令人困惑,因爲他們認爲使用類別來覆蓋現有的方法是可以的(或者至少沒有明確說明你不能這樣做)。你不能這樣做。這是一種定義不明確的行爲,在某些情況下,它是完全未定義的行爲。你通常應該繼承以覆蓋一個方法。

有一個叫做交叉混合,將允許你這樣做沒有一個子類先進的技術,但它是一個非常專業的,有時脆弱的技術,而不是用於一般用途。

但是在任何情況下您都不應該使用類別來覆蓋現有的方法。

+0

感謝您的評論。 – johe 2012-08-06 14:47:51