我无法弄清楚为什么我的应用在我做了几次后崩溃了:
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 ..我很喜欢所有内存管理的东西,我知道......谢谢!
答案 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
。这样,如果传入一个可变字符串,它将被复制而不是保留(并且仍然只保留不可变字符串)。