2011-10-07 255 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