2015-04-30 93 views
0

iOS新手試圖從另一個類中拉出數組並獲取錯誤。基本上,我不明白方法和屬性之間的區別,我意識到,所以這可能會幫助我更好地理解這一點。Objective-C:從另一個類調用方法的語法

我已經創建了一個返回數組的方法。我想使用其他類陣列(好像回到在其他語言中值的函數),所以我認爲如下我會做到這一點:

class1 
- (id) getTags{ 
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Tags"]; 
    fetchRequest.resultType = NSDictionaryResultType; 

    NSError *error  = nil; 
    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest 
                    error:&error]; 

    NSMutableArray * tags = [[results valueForKey:@"tag"] mutableCopy]; 
    return tags; 
} 

換句話說,我想用什麼方法返回作爲Objective C中的一種變量稱爲屬性。該方法也在.h文件中,以便它公開。

在2 I類進口類1的頂部,然後嘗試調用方法如下:

NSArray *newarray = [class1 getTags]; 

但是我得到錯誤「沒有已知的類方法的選擇getTags」

誰能告訴我我做錯了什麼?

謝謝。

回答

3

我懷疑這一行;

NSArray *newarray = [class1 getTags]; 

實際上,你應該使用類實例,而不是類本身。 要使用這種函數調用,您應該將getTags聲明爲類級別函數(+函數),而不是 - 函數

因此,您的代碼應該看起來像這樣;

class1 *class1Instance = [[class1 alloc] init]; 
NSArray *newarray = [class1Instance getTags]; 
2

的問題是代碼NSArray *newarray = [class1 getTags];

要調用類方法getTagsclass1;但是您只有class1中的實例方法getTags

要解決此問題,請在方法簽名中更改 - to +,這會將方法從實例方法更改爲類方法。 (用java語言:+是你在方法中放置靜態的地方)。

但是,代碼中存在相當多的樣式問題。 首先,我不認爲把代碼放入.h是一個好習慣。你可能想要的是

.H

@interface Class1 
+ (NSArray *)getTags; 
@end 

.M

@implementation Class1 
+ (NSArray *)getTags { ... } 
@end 

所以你宣佈你的公有接口中的.h文件和實施.M。此外,你可能想要大寫你的類名。

您不應該使用id作爲返回類型,並將id[class1 getTags]指定爲NSArray *。這裏有一個隱含的轉換,有時可能會導致一些很好的調試時間。

NSArray可以作爲你的方法的返回類型,因爲NSMutableArrayNSArray繼承 - Apple Documentation of NSMutableArray

+0

我最初試圖NSArray的,但它給了錯誤「矛盾的返回類型」,並在回線之下給了錯誤「返回的NSMutableArray * ____強從具有不兼容結果類型的函數中獲取「。切換到ID擺脫了這兩個錯誤。 – user1904273

+0

您是否使用'NSArray *'作爲返回類型而不是'NSArray'?這是人們第一次學習Obj-C時的常見錯誤。 – Steven