何时发布以及如何使用这些实例变量来避免内存泄漏?

时间:2011-07-15 21:59:57

标签: iphone objective-c cocoa

我是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创建, copynew。或者我只能在init中使用varA=,我不需要发布。对于其他类方法,最好使用setter / getter,这样我就可以毫无问题地使用self.varA=... appendString:self.varA ......=self.varA。这一切都正确吗?

第二个疑问,在内存管理和简单性方面最好的是,在使用或不使用自动释放的情况下为init方法中的对象分配实例变量?如果我分配给它而没有autorelease,我将不得不解除它,但是如果我使用autorelease,变量可以在我想要之前被释放(比如将在其中使用的自动释放的self.varB = [OtherClass...释放MyClass时的dealloc方法。

第三,即使我不在init方法中使用它们,我是否必须释放所有实例变量但是我可以在同一类的其他方法中使用它们(读/写)? (例如varC中的method1或未使用的varD

第四,如果我在varAmethod1方法中做得好,我是否需要在initClass中分配新值后照顾dealloc?换句话说,这会产生内存泄漏吗?

第五,如果我用autorelease声明这个类就像一个ViewController中的实例变量(MyClass *c; ... c = [[[MyClass alloc] initClass:@"description"] autorelease];)而我设置了@property,那么我如果我将其与c=...而不是self.c=...一起使用,则必须发布一个版本吗?据我所知,行为与我的示例相同,所以我应该使用viewDidLoadviewWillAppear中的setter / get方法,并在dealloc中将其释放,而不是{{1} }}

第六个也是最后一个,实例变量self.varA相同?

...谢谢

2 个答案:

答案 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