我在标题中有这个userInputstring,它将被.m文件中的多个方法修改和使用
.h
NSString *userInputString;
-(void)main;
-(void)method1;
-(void)method2;
.m
-(void)main{
[self method1];
[self method2];
}
-(void)method1{
NSString *localString = @"something";
userInputString = localString;
//do something else with it
}
-(void)method2{
NSString *localString = [NSString stringWithFormat:@"%@ insert something",userInputString];
userInputString = localString;
[someOtherMethod:userInputString];//Crash
}
但我一直遇到内存泄漏问题。设置它的正确方法是什么?我是客观c的新手。
答案 0 :(得分:2)
我不知道在哪里或如何发布
是的,您首先需要熟悉Cocoa Memory Management Rules。
总之,如果您通过alloc获取对象,包含“copy”的方法,以“new”开头的方法,或者如果您保留它,则需要释放或自动释放。
采取方法1:
-(void)method1{
userInputString = @"something";
}
未使用alloc,new或copy获取userInputString,也没有保留它。因此,您不拥有它,因此您不能释放它。如果你这样做了:
userInputString = [@"foo" copy];
或者这个:
userInputString = [[NSString alloc] initWithString: @"foo"];
或者这个:
userInputString = [@"foo" retain];
你拥有该字符串,因此你必须释放或自动发布它。
发布时取决于其范围。如果它是局部变量,则必须在退出时声明块之前释放或自动释放它。如果它是实例变量,则必须在取消分配它所在的对象之前释放它。即你必须在对象的dealloc方法中释放它。在所有情况下,如果您覆盖您拥有的对象,则必须先将其释放。所以:
userInputString = [someOtherString copy]; // you own userInputString
// do some stuff
[userInputString release]; // you no longer own it
userInputString = [someOtherString retain];// overwrite the pointeer with something else
这是为实例变量添加getter和setter的原因之一。每次设置新值时,都必须释放旧值并保留新值(确保旧的bvalue和新值不同),因此将其封装在setter中。合成属性会自动添加此代码。
答案 1 :(得分:0)
尝试使用自动释放池:
int main()
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
....
// Your code here
[pool drain]
return 0;
}
答案 2 :(得分:0)
@“blablabl”是从常量字符串创建自动释放的 NSString的简写。如果你正在运行的线程中没有自动释放池,那么这些NSString对象将永远不会被释放,当然你会造成泄漏。
要么像Sumai建议的那样创建自动释放池,要么自己释放这些对象的内存。 (提示:创建一个NSAutorelesePool ;-))