方法之间的内存大问题

时间:2011-04-28 18:57:30

标签: objective-c memory

我不明白这个问题:

我有2个A类和B类,在A视图中我有两个Button,ButtonCreate和ButtonAccess。

在B中有这种方法:

-(NSDictionary *) returnData
{
   NSDIctionary *data= [NSDictionary withObjectsAndKeys.....];
   return data;
}

在A i中还有一个属性@property(nonatomic, retain) NSDictionary *dictio,以及.m文件@synthesize dictio = _dictio

ButtonCreate IBAction - >

B *secondaryClass = [[B alloc] init];
_dictio = [[secondaryClass returnData] retain];
[B release];

ButtonAccess IBAction - >

NSString *value = [_dati ObjectForKey... ];

问题:如果我多次按下ButtonCreate,在Instruments中我看到内存泄漏,但如果我在ButtonCreate方法中切断“保留”,当我从ButtonAccess访问数据时,我发生了崩溃。

我真的不明白我该怎么办...你能帮助我吗?

非常感谢。

3 个答案:

答案 0 :(得分:0)

您没有发布_dictio的旧值,而您没有发布secondaryClass

B *secondaryClass = [[B alloc] init];

if (_dictio != nil) 
     [_dictio release];

_dictio = [[secondaryClass returnData] retain];
[secondaryClass release];

但是,既然您已将您的财产声明为保留,您可以利用该财产为您执行此操作。

B *secondaryClass = [[B alloc] init];
self.dictio = [secondaryClass returnData]; // sends retain to new, release to old
[secondaryClass release];

答案 1 :(得分:0)

在A中试试这个,我认为它可以解决你的问题:

ButtonCreate IBAction --> B *secondaryClass = [[B alloc] init];
self.dictio = [secondaryClass returnData];
[B release];

答案 2 :(得分:0)

看起来你正试图发布B,而不是你命名为secondaryClass的B实例。

B *secondaryClass = [[B alloc] init];
_dictio = [[secondaryClass returnData] retain];
[B release];

不应该是:

...
[secondaryClass release];