【发布时间】:2012-07-05 14:52:02
【问题描述】:
假设我有一个名为 MyTestClass.h 的类。
类结构是这样的
@interface MyTestClass : NSObject {
NSString *testString;
}
@property (nonatomic, retain)NSString * testString;
@end
.m 文件
@implementation MyTestClass
@synthesize testString;
-(id) init{
[self setTestString:@""];
return self;
}
-(void)dealloc{
[self.testString release];
testString = nil;
[super dealloc];
}
@end
现在我创建了一个 MyTestClass 对象并分配了两次 testString
MyTestClass * myTestClass = [[MyTestClass alloc] init];
[myTestClass setTestString:@"Hi"];
[myTestClass setTestString:@"Hello"];
现在我想,我的 testStrings 内存泄漏了两次!! (一个通过 init() 另一个通过我的第一个 setTestString 方法)
我说的对吗?还是@property (nonatomic, retain) 会处理/释放先前分配的内存?
或者,在这种情况下,我是否需要像下面的代码一样覆盖 MyTestClass.m 中的 setTestString()
-(void)setTestString:(NSString *)tempString{
[testString release];
testString = nil;
testString = [tempString retain];
}
感谢您对此问题的任何帮助。
谢谢。
【问题讨论】:
-
你没有泄露任何我能看到的东西——尽管我使用的是 ARC。据我所知,如果您创建了一个赋值变量,然后在您的方法结束之前没有释放它,您只会在这种情况下泄漏。
-
请注意,您的
dealloc方法也可以在调用super之前简化为self.testString = nil;,这将使用自动生成的setter 自动释放之前的testString 值。 -
苹果文档明确声明不要在 init 和 dealloc 方法中使用访问器。希望引用文档但目前找不到,这将不得不这样做stackoverflow.com/questions/192721/…
-
你的意思是写“@property (nonatomic, retain)NSString * testString;”和“@synthesize testString;”将自动处理所有内存管理..对吗?如果没有,那么我在哪里释放属性?
标签: iphone objective-c memory-management properties memory-leaks