分配和释放问题

时间:2011-08-07 19:59:38

标签: objective-c ios memory-management

我无法弄清楚为什么我的应用在我做了几次后崩溃了:

potionsT是非原子的,保留,只读。

-(void)First:(NSString*)Potions {

    potionsT = [[NSString alloc] initWithString:Potions];
}

-(void)After:(NSString*)Potions {
    [potionsT release];
    potionsT = [[NSString alloc] initWithString:Potions];

你看,我第一次打电话给第一个,然后我打电话几次After:并且wopes,它崩溃了。使用ECX_BAD_ACCESS ..我很喜欢所有内存管理的东西,我知道......谢谢!

3 个答案:

答案 0 :(得分:3)

保留属性的关键是它在设置时处理保留和释放。

- (void)first:(NSString*)potions
{
    self.potionsT = potions; // will automatically release old value and retain new
}

- (void)after:(NSString*)potions
{
    self.potionsT = potions; // same as above
}

另请注意我如何将您的Potions重命名为potions,将First:重命名为first:,将After:重命名为after:。 Objective-C命名约定是用小写字母和带有大写字母的类名来启动变量和方法。

答案 1 :(得分:2)

你是@synthesize这个班级的@implementation属性了吗?如果是这样,那么你应该使用:

self.potionsT = Potions;

如果您使用

potionsT = ...

然后你正在访问ivar,而不是属性。要访问该属性并让它为您执行内存管理,您必须在它之前添加实例引用,并且它也可以是self。

如果您使用该属性,则不应手动释放potionsT,因为该属性已经为您执行此操作。

答案 2 :(得分:2)

如果您已将potionsT设置为属性,则应以这种方式访问​​:

-(void)first:(NSString*)potions {
    self.potionsT = potions;
}

-(void)after:(NSString*)potions {
    self.potionsT = potions;
}

在这两种情况下,我都更改了代码以使用potionsT的访问者(这就是self.potionsT的含义)。我也没有创建一个新的字符串,只是保留了提供的字符串。由于NSStrings是不可变的,因此结果是相同的。但是,为了获得最佳效果,请将potionT属性从retain更改为copy。这样,如果传入一个可变字符串,它将被复制而不是保留(并且仍然只保留不可变字符串)。