2011-08-31 89 views
0

我弄明白了,我无法释放我在其他类的appDelegate中设置的变量。我有一个类myClass无法释放我的appDelegate变量

In myClass.m if I do : 

    appDelegate = [[UIApplication sharedApplication] delegate]; 

    appDelegate.aString = [[NSString alloc] init]; //aString is declared and synthesized in appDelegate class. 
    [appDelegate.aString stringWithString:@"test"]; 
    [appDelegate.aString release]; 

    NSLog(appDelegate.aString); 

我在控制台中得到“测试”。

我做错了什么? :/

+0

当你输入'[appDelegate.aString stringWithString:@“test”];'? – Nekto

+0

其实我想从其他类访问aString。就像一个全局变量。当我输入这个时,我的意思是设置我的appDelegate的aString变量。 – ShiniFox

+0

然后你应该这样写:'appDelegate.aString = @“test”;'或this:'[appDelegate setAString:@“test”];' – Nekto

回答

1

属性aString有哪些属性?很可能您使用的是retain属性,它将(如名称所示)在分配时保留基础对象。因此,分配给appDelegate.aString后,你有一个NSString具有至少2的保留计数你NSLogrelease因此将使用对象有保留至少1

附录的计数:您的声明[appDelegate.aString stringWithString:@"test"];是空的。它调用实​​例上的类方法(本身不是一个好主意),但此方法返回一个新字符串,其内容为test。你要求这个字符串,并立即丢弃它。 aString而不是被这种方法改变。

+0

是的我的财产设置为(非原子,保留)。我应该使用什么财产? – ShiniFox

+0

这不是你应该改变属性的属性('保留'是好的)。你只需要以不同的方式使用它。要释放'retain'属性元素的内容,请将该属性设置为'nil'。你仍然需要'释放'本地创建的'NSString'实例,就像你现在所做的那样。 –

1

您没有正确使用属性。您的代码应阅读:

appDelegate = [[UIApplication sharedApplication] delegate]; 

appDelegate.aString = [NSString stringWithString:@"test"]; // This will be retained by your appDelegate 
appDelegate.aString = nil; // This will cause your appDelegate to release the variable 

NSLog(@"%@",appDelegate.aString); // don't put objects directly in to NSLog 

因为它代表你已经创建了一个自动释放的对象(stringWithString),然后将其设置为你的财产再保留它。

0

您应该使用XCode内置的“分析”系统。 shift⌘a - 编译和分析。

它会告诉你很好的蓝色箭头,你保留,释放和overretain/overrelase变量。

+0

嗯,我真的不明白这是如何工作的<<,但箭头似乎没有超出我声明我的变量的方法,然后以另一种方法释放它。我仔细查看了我的代码,并且有1个分配给1个发布...每次... – ShiniFox

+0

阅读@Jrturton的帖子,他解释了这一点。添加到分析功能后,您应该回到正轨。 – Kheldar