我是iPhone开发的新手,在阅读了Apple文档和几篇帖子之后,我仍然对内存管理有些怀疑。请支持这个基本课程:
//MyClass.h
@interface MyClass : NSObject {
NSString *varA;
OtherClass *varB;
NSString *varC;
NSString *varD;
}
@property (nonatomic, copy) NSString *varA;
@property (nonatomic, retain) OtherClass *varB;
@property (nonatomic, copy) NSString *varC;
@property (nonatomic, copy) NSString *varD;
+ (id) initClass:(NSString *)desc;
- (void) method1:(NSString *)desc;
@end
有了这个实现:
//MyClass.m
@implementation MyClass
@synthesize varA;
@synthesize varB;
@synthesize varC;
@synthesize varD;
+ (id) initClass:(NSString *)desc{
self = [super init];
if( self ){
self.varA = [NSString stringWithString:desc];
self.varB = [OtherClass initClassWithAutorelease:@"a description"]; //this class return an autoreleased object
[varB aMethod:@"something"];
}
return self;
}
- (void) dealloc{
[varB aMethod:@"something"];
[varA release];
[varB release];
[super dealloc];
}
- (void) method1:(NSString *)aString{
self.varC = aString;
self.varA = [NSString stringWithString:@"new value"];
[varB aMethod:@"something"];
}
@end
此时我想到的是,@property
的实例变量必须在类的init方法中没有self.
时使用,并且在没有self.
的情况下释放它们dealloc,在其他方法中,对所有情况使用self.
都很方便。所以这是我的怀疑:
首先,我想如果我在init方法中使用self.varA=
,则保留计数器会增加,所以我必须在dealloc方法中释放它,即使该对象尚未使用alloc
创建, copy
或new
。或者我只能在init中使用varA=
,我不需要发布。对于其他类方法,最好使用setter / getter,这样我就可以毫无问题地使用self.varA=
,... appendString:self.varA ...
或...=self.varA
。这一切都正确吗?
第二个疑问,在内存管理和简单性方面最好的是,在使用或不使用自动释放的情况下为init方法中的对象分配实例变量?如果我分配给它而没有autorelease
,我将不得不解除它,但是如果我使用autorelease
,变量可以在我想要之前被释放(比如将在其中使用的自动释放的self.varB = [OtherClass...
释放MyClass
时的dealloc方法。
第三,即使我不在init方法中使用它们,我是否必须释放所有实例变量但是我可以在同一类的其他方法中使用它们(读/写)? (例如varC
中的method1
或未使用的varD
。
第四,如果我在varA
和method1
方法中做得好,我是否需要在initClass
中分配新值后照顾dealloc
?换句话说,这会产生内存泄漏吗?
第五,如果我用autorelease
声明这个类就像一个ViewController中的实例变量(MyClass *c;
... c = [[[MyClass alloc] initClass:@"description"] autorelease];
)而我设置了@property
,那么我如果我将其与c=...
而不是self.c=...
一起使用,则必须发布一个版本吗?据我所知,行为与我的示例相同,所以我应该使用viewDidLoad
或viewWillAppear
中的setter / get方法,并在dealloc
中将其释放,而不是{{1} }}
第六个也是最后一个,实例变量self.
与varA
相同?
...谢谢
答案 0 :(得分:2)
答案 1 :(得分:0)
当你写“alloc,retain,copy,new”时,你负责在dealloc方法中释放它们。前
.h file
NSString * string;
@property (nonatomic, retain)NString * string;
.m file
@synthesize string;
-(void)dealloc{
[string release];
}
希望有所帮助:D