记忆管理问题

Osc*_*car 2 cocoa memory-management class objective-c

我以为我得到了可可内存管理的支持,但我显然还有很多需要学习的东西.

看看我写的这堂课:

Word.h

#import <UIKit/UIKit.h>


@interface Word : NSObject {
    NSString *word;
    NSMutableArray *wordArray;
}

@property (nonatomic ,retain) NSString *word;
@property (nonatomic ,retain) NSMutableArray *wordArray;

@end
Run Code Online (Sandbox Code Playgroud)

Word.m

#import "Word.h"


@implementation Word

@synthesize word, wordArray;

- (void)setWord:(NSString *)aWord {
    NSMutableArray *newValue = [[NSMutableArray alloc] init];
    self.wordArray = newValue;
    [newValue release];

    for (int i = 0 ;i < [aWord length] ;i++) {
        NSString *character = [[NSString alloc] init];
        character = [NSString stringWithFormat:@"%C",[aWord characterAtIndex:i]];
        [wordArray addObject:character];
        //[character release];
    }
}

- (void)dealloc {
    [word release];
    [wordArray release];
    [super dealloc];
}

@end
Run Code Online (Sandbox Code Playgroud)

正如你可以看到我在设置字符串时填充数组.我通过拉出字符串的char并将它们放入一个新分配的字符串中来填充for循环.然后我把那个字符串放在数组中,然后我必须释放字符串.而且我在这里做错了,因为我正在释放我投入阵列的价值.当我以后试图使用该阵列时,它就消失了.

我该怎么办呢?将"character"作为属性并在dealloc中释放它是错误的,因为它只是暂时的.

Jak*_*org 6

首先,你并不需要分配一个新的NSStringcharacter,你立刻被另一个对象覆盖它.请记住,它是一个指针,因此当您指定它时,您不会更改它指向的对象,只会将其指向另一个对象.因此character,当我们丢失指向它的指针时,您分配并最初分配给的对象将泄露到下一行.

现在,stringWithFormat返回一个自动释放的字符串,character然后指向该字符串.您不应该发布此对象,但这是注释掉的行中发生的情况.所以这个循环会更好:

for (int i = 0 ;i < [aWord length] ;i++) {
        NSString* character = [NSString stringWithFormat:@"%C",[aWord characterAtIndex:i]];
        [wordArray addObject:character];
}
Run Code Online (Sandbox Code Playgroud)

  • 自动释放池在运行循环中释放,即在正常代码之外.它不会在你的一个方法中间触发.编辑:如果你使用后台线程,否则这可能是一个问题,你需要设置一个线程本地自动释放池,正是出于这个原因.但这不是问题. (2认同)