Iphone NSString的简单问题

Iphone NSString的简单问题,iphone,objective-c,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 =

我在头文件中有一个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不熟悉。

尝试使用自动释放池:

int main()
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    ....
    // Your code here

    [pool drain]
    return 0;
}
@“blabl”是从常量字符串创建自动删除的NSString的缩写。如果您正在运行的线程中没有自动释放池,那么这些NSString对象将永远不会被释放,当然您的线程将创建一个泄漏

要么按照Sumai的建议创建一个自动释放池,要么自己释放这些对象的内存。(提示:创建NSAutoReleasePool;-))


我不知道在哪里或如何发布

对,你首先需要熟悉一下

总之,如果您通过alloc获得一个对象,一个包含“copy”的方法,一个以“new”开头的方法,或者如果您保留它,您需要释放或自动释放

采取方法1:

-(void)method1{
    userInputString = @"something";
    }
userInputString不是通过alloc、new或copy获得的,您也没有保留它。因此,你不拥有它,所以你不能释放它。如果您已经这样做了:

userInputString = [@"foo" copy];
或者这个:

userInputString = [[NSString alloc] initWithString: @"foo"];
userInputString = [@"foo" retain];
或者这个:

userInputString = [[NSString alloc] initWithString: @"foo"];
userInputString = [@"foo" retain];
您确实拥有该字符串,因此必须释放或自动释放它

当您发布它时,它取决于它的范围。如果它是局部变量,则必须在退出中声明它的块之前释放或自动释放它。如果它是实例变量,则必须在释放它所在的对象之前释放它。i、 e.必须在对象的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中。合成属性会自动添加此代码。

没有错误消息,只是内存泄漏。通过使用乐器找到它。你必须展示你是如何创建字符串的,如果你真的这样做了,你是如何释放它的。否则我们无法知道什么是错误的,我应该将userInputString设置为属性吗?我不知道在何处或如何释放您发布的代码中的任何内容都不会导致内存泄漏。您需要展示如何使用userInputString。即使使用自动释放池,常量NSString(例如@“foo”)也不会被释放。@JeremyP感谢您的详细回答。我仍然对你答案中的最后一段代码和最后一段感到困惑。因此,如果我将userInputString设置为属性@属性(非原子,复制)NSString*userInputString在.h文件中,每次将其设置为方法中本地字符串的值时,我需要做什么?只是userInputString=[someOtherString copy]吗?属性释放当前存储的值并获取新值?@Fasid:如果您写入
userInputString=
,您没有使用属性访问器,您只是设置实例变量。它必须是
self.userInputString=
[self-setUserInputString:
属性相关。@chuck我明白了。内存管理呢?我说的对吗?我只需要在dealloc中释放一个属性?@Fasid:没错。
retain
属性将处理它自己的内存管理,而你只需要在
dealloc
中释放对象。什么关于复制?@属性(非原子,复制)NSString