2013-01-23 67 views
0

我在調用類中使用了前向聲明。無法調用其他類中的方法

.h文件中在ClassTwo

@class ClassOne 

@property(nonatomic,retain) ClassOne *class_One; 

.m文件

@synthesize class_One; 

然後我試圖調用此方法在ClassOne

[self.class_One callingThisMethodFromClassTwo]; 

另如果我創建爲在ClassOne hared實例,並使用它作爲一個類的方法它的工作原理

[[ClassOne Shared] nowItWorks]; 

很抱歉,如果這是一個愚蠢的問題,我很新

+0

您調用類方法的方法是什麼?當你聲明一個方法時,+之前的+(+(void)classMethod:(id)sender)意味着它是一個類方法,並且只能被[ClassOne classMethod:self]調用,並且 - 在它之前( - (void)instanceMethod:(id)sender)表示一個實例方法,這意味着它將由ClassOne調用* classOne = [[ClassOne alloc] init]; [classOne instanceMethod:self]; – Echihl

+0

您是否分配或設置了該變量? –

+0

您是否正在導入第二種情況下的'ClassOne.h'?將它導入ClassTwo.m的頂部應該使第一個版本也可以工作。 –

回答

1

嘗試分配class_One實例,並添加#import "ClassOne.h"到頁眉您classtwo.m頂部

self.class_One= [[ClassOne alloc]init]; 
[self.class_One callingThisMethodFromClassTwo]; 
0

如果[self.class_One callingThisMethodFromClassTwo];失敗......這種直接指的是

  1. class_One不是alloc + init-ed。

  2. callingThisMethodFromClassTwo是一種私人/受保護的方法。

  3. callingThisMethodFromClassTwo是一種類方法。

0

我建議您在此問題上使用Protocol/Delegate

你應該爲你的類聲明一個委託協議。委託協議和接口的類Foo的一個例子可能是這樣:

@protocol MyClassDelegate

//要求意味着,如果他們想使用委託他們 //必須實現它。 @required //您想要從另一個班級調用的方法。 - (void)taskComplete:(BOOL)complete; @end

@interface MyClass的:NSObject的 {// 我們不知道什麼樣的班會採用我們在 //編譯時間,這就是爲什麼這是一個id ID代表; }

@property(nonatomic,assign)id delegate;

  • (void)taskComplete;
  • (void)doSomeTask;

假設你有一個複雜的項目,並不希望創建大量的類之間 的聯繫,像這樣的這種情況下,代表團將是實現你的最佳途徑。這就像使用函數指針和回調函數,但通信很容易。有時間採用我們的協議,並在課堂上實際使用它。

myClass = [[MyClass alloc] init]; 
// Very important. If we don't let myClass know who the delegate 
// is we'll never get the protocol methods called to us. 
[myClass setDelegate:self]; 

在這裏你可以調用另一個類的方法。我希望這能幫到您。

相關問題