2011-10-07 102 views
3

我有一個類「ClassA」與「MethodA」,我也有一個「ClassB」,我想從「ClassB」調用「methodA」;我寫IOS:調用另一個類的方法

@classA; 

@property(nonatomic, retain) ClassA *classA; 
//and also @synthesize... 

然後調用方法與

[self.classA method]; 

,但它不調用該方法....然後我寫的viewDidLoad在CLASSB

self.classA = [[ClassA alloc]init]; 

但是這件事情重置ClassA中的變量。

我該如何解決這種情況?

+0

你爲什麼要在viewDidLoad方法中實例化一個屬性的任何原因?通常當你有一個屬於另一個類的屬性時,你可以在類「init」方法中實例化它。類似於 - http://stackoverflow.com/questions/7639179/potential-leak-of-an-object-warning-clarification-needed/7639293#7639293 – 5StringRyan

回答

2

編輯:我決定重寫我的答案,因爲我不認爲原文措辭良好。

我認爲你無法理解Objective-C 2.0點符號的作用。這很容易混淆,特別是如果你用C或C++編程,因爲它在語法上等效於struct字段或class變量訪問操作符,但在語義上是不同的。

當你使用:

self.classA = newClassA; 

你實際上是在做一樣的:

[self setClassA: newClassA]; 

而當@property classAretain屬性定義,編譯器生成的setter方法,就像這樣:

- (void) setClassA:(ClassA *)newClassA 
{ 
    if (classA != newClassA) 
    { 
     [newClassA retain]; 
     [classA release]; 
     classA = newClassA; 
    } 
} 

在代碼中你有gi VEN:

[self.classA method]; 

實際上擴展到:

[self setClassA: method]; 

這是不是你打算什麼。

避免這種混淆的最簡單方法是根本不使用點符號,特別是不在處理分配或取消分配變量的同一類的實例方法中。

+0

不,這是相同的東西 – CrazyDev

+0

但在這種情況下,它不執行classA中的方法,因爲classA的實例是nil – CrazyDev

+0

我不明白,你能寫一個例子嗎? – CrazyDev

1

您正在使用alloc和init創建ClassA的新實例。你需要的屬性設置爲現有的ClassA的實例,就很難勸怎麼沒有更多的情況下,但也許當你創建類B,做

classB.classA = self; 

這假定A類在創建B類第一名。

+0

你能解釋一下嗎? – CrazyDev

+1

@blackguardian,你能解釋一下你如何創建classB實例嗎? – jamapag

+0

in classA我做#import classB;在我做@property(保留)ClassB * classB; – CrazyDev