3

私はこのメンバーを持っているとしましょう:

@property (retain, nonatomic) Student *student;
@synthesize student;

ここで、他のクラスで、学生を設定しているとしましょう。つまり、新しく作成したオブジェクトを学生に割り当てています。ここで、学生が以前に 1 つのオブジェクトを参照していたとします。私の質問は、学生に新しいオブジェクト参照を割り当てたときに、このオブジェクトが解放されるかどうかです。このコードでは

someClassObjectRef.student = newStudent; //someClassObjectRef.student is already having one student object ref

新しいオブジェクトを割り当てる前に古いオブジェクトを明示的に解放する必要がありますか? 私が言おうとしていることを理解していただければ幸いです。

注: ARC は使用されません。

ありがとう。

4

2 に答える 2

3

合成されたセッターはrelease、新しいオブジェクトを保持する前に、以前に保持されたオブジェクトをすべて削除します。何かのようなもの:

- (void)setStudent:(Student *)student
{
    [student retain];
    [_student release];
    _student = student;
}

古いオブジェクトを -ing する前にretain渡されたオブジェクトであることに注意してください。これにより、割り当てを解除せずに同じオブジェクトをそれ自体に渡すことができます。 release

これを行うには、他にも方法があります。たとえば、次のとおりです。

- (void)setStudent:(Student *)student
{
    if (student != _student)
    {
        [_student release];
       _student = [student retain];
    }
}

学生オブジェクトを解放する適切な方法は、メソッドで設定nilすることです。dealloc

- (void)dealloc
{
    [self setStudent:nil];    // or self.student = nil;
    [super dealloc];
}
于 2012-07-27T09:05:07.943 に答える
1

- (void)dealloc メモリ管理をオンまたは `- (void)viewDidUnloadにしたいことを願っています

- (void)dealloc {
   [student release]; or  [self setStudent:nil];
    [super dealloc];
 }

これらはメモリ管理のベスト プラクティスです。または、使用時にオブジェクトを作成し、使用後に解放することができます。

Student *student = [[Student alloc]init];
// Do Some Work over here
[student release];
于 2012-07-27T09:21:19.650 に答える