NSString的简单问题

时间:2010-09-08 07:28:56

标签: iphone objective-c

我在标题中有这个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的新手。

3 个答案:

答案 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 ;-))