2014-10-30 18 views
1

讓我開始說我知道錯誤的含義。基本上說,Selector方法是在沒有該方法的對象上調用的。爲什麼Xcode抱怨「無法識別的選擇器發送到實例」錯誤?

不管怎麼說,這是我Tile.h頭文件:

#import <Foundation/Foundation.h> 
#import "Weapon.h" 
#import "Armor.h" 


@interface Tile : NSObject 

@property (strong, nonatomic) NSString *story; 
@property (strong, nonatomic) Weapon *weapon; 
@property (strong, nonatomic) Armor *armor; 
@property (nonatomic) int healthEffect; 

@end 

這裏是我的Factory.h頭文件:

#import <Foundation/Foundation.h> 


@interface Factory : NSObject 

- (NSArray *)tiles; 

@end 

,這裏是我的Factory.m文件:

#import "Factory.h" 
#import "Tile.h" 

@implementation Factory 

- (NSArray *) tiles 
{ 
    Tile *tile7 = [ [Tile alloc] init]; 
    tile7.story = @"blah blah"; 
    tile7.healthEffect = 8; 
} 
@end 

Factory.m文件中排除了一些代碼,因爲它們很重要,但如果我嘗試編譯並運行,則會出現此錯誤:

2014-10-29 17:26:27.944 Pirate Adventure[718:15257] 
-[Tile setHealthEffect:]: unrecognized selector sent to instance 0x7b03b8e0 
2014-10-29 17:26:27.946 Pirate Adventure[718:15257] *** Terminating app due to uncaught 
exception 'NSInvalidArgumentException', reason: '-[Tile setHealthEffect:]: unrecognized 
selector sent to instance 0x7b03b8e0' 

這是抱怨,當我嘗試設置tile7.healthEffect = 8;

我甚至不明白爲什麼它會抱怨setHealthEffect方法,我甚至沒有在我的Tile.h頭文件中定義它。另外,healthEffect只是tile對象的一個​​屬性,所以我應該能夠將它設置爲我想要的任何整數值,而無需定義方法來設置正確的值。

我很困惑。

謝謝!

新增Tile.m文件:

#import "Tile.h" 

@implementation Tile 

@synthesize healthEffect = _healthEffect; 

@end 
+0

當我看着你的'tiles'方法時,只是一個小問題。你指定了一個'NSArray *'的返回類型,但在實際實現中沒有返回語句。對於我們給你一個答案,你可能需要編輯帖子,以包括代碼,你實際上設置healthEffect – Andriko13 2014-10-30 00:51:38

+0

對不起,關於這一點,我沒有返回瓷磚陣列,只是沒有包括它在那裏 – Pangu 2014-10-30 02:29:20

+0

我重新創建情況,但我的代碼使用您提供的相同方法/實現/類可以正常工作。可能這個錯誤可能是由不同於'tile7.healthEffect = 8'的行造成的?如果不是,則錯誤是由您未包含的代碼引起的。我還會根據錯誤消息告訴你這個方法被一個類而不是一個對象調用的可能性檢查tile7的干擾多態性或多個聲明。 – Andriko13 2014-10-30 03:10:36

回答

1

tile7.healthEffect = 8; 

僅僅是

[tile7 setHealthEffect: 8]; 

語法舒加如果你在一個類中有一個@property聲明中,編譯器通常會自動生成setter setHealthEffect和getter healthEffect以及instanc e變量_healthEffect爲你,除非你自己創建它們。

我懷疑你的問題在Tile.m.你能分享一下嗎?

+1

是的,由於某種原因,制定者尚未產生。我已經失去了它的時間,並且不再自動生成,因爲他們已經多次改變規則。但是,OP有可能爲'healthEffect'設置一個'@ synthesize',這會讓這個applecart感到不安。 – 2014-10-30 01:02:18

0

這個問題並不存在於您迄今與我們分享的代碼中。出於某種原因,你的二傳手根本就沒有被合成。請分享您的Tile實施。例如,你會得到這種錯誤如果任:

  • healthEffect是由Tile類使用的協議聲明的屬性;或

  • Tile實施有明確宣稱,物業不應該被合成一條線:

    @dynamic heathEffect; 
    

你繼續問:

出於某種原因,你的二傳手根本沒有被合成。

I don't even understand why it's complaining about the setHealthEffect method, I don't even have that define in my Tile.h header file.

作爲克勞斯指出的那樣,使用tiles.healthEffect = ...相當於調用setHealthEffect

Also, healthEffect is just a property of the tile object, so I should be able to set it to whatever integer value I want without having to define a method to set the value right?

正確。這個setHealthEffect方法應該自動爲你合成。自Xcode 4.4版以來,這些設置器已經爲我們合成。在你的問題中沒有什麼可以說明爲什麼在這種情況下這個二傳手並不是你合成的。

+0

更新了我的帖子,我的Tile.m文件中沒有任何內容。該代碼沒有爲我自動合成。奇怪的是,我也有另一個文件,採取另一個nonatomic屬性整數變量,並沒有合成工作正常 – Pangu 2014-10-30 02:32:16

+0

很難猜測沒有看到更多,因爲這裏沒有什麼會說明爲什麼它不會自動合成爲您。幾個最後的建議:1.嘗試清除「派生數據」文件夾並重新啓動Xcode,並確保沒有一些奇怪的狀態問題。 2.嘗試重新創建您描述的[MCVE](http://stackoverflow.com/help/mcve)問題,因爲直到我們可以重現它,它是不可能修復它的。我無法重現您描述的行爲。 – Rob 2014-10-30 02:39:20

+0

感謝您的建議Rob。我會嘗試一些事情並回復你。 – Pangu 2014-10-30 02:55:47

相關問題