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中释放它是错误的,因为它只是暂时的.
首先,你并不需要分配一个新的NSString
来character
,你立刻被另一个对象覆盖它.请记住,它是一个指针,因此当您指定它时,您不会更改它指向的对象,只会将其指向另一个对象.因此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)
归档时间: |
|
查看次数: |
140 次 |
最近记录: |