Rumah > Soal Jawab > teks badan
1. Apabila ARC dimatikan, mengapa pembolehubah ahlinya boleh terus diakses selepas objek Object-c dikeluarkan secara aktif?
Kod adalah seperti berikut:
@interface person : NSObject
@property int a;
@end
@implementation person
@synthesize a;
- (void) dealloc
{
NSLog(@"dealloc person");
}
@end
int main()
{
person* p = [[person alloc]init];
p.a = 10;
NSLog(@"%d", p.a); //10
[p release]; // dealloc
p.a=20;
NSLog(@"%d", p.a); //20
return 0;
}
Masalah:
Selepas memanggil [p release];, anda masih boleh mengakses pembolehubah a p;
Soalan:
Mengapa saya boleh terus mengaksesnya selepas [p keluaran] dan mengapa tiada ralat dilaporkan?
Cadangannya ialah sebaik-baiknya jangan teruskan mengakses selepas dikeluarkan. Jika anda boleh mengaksesnya, dalam keadaan apakah masalah akan berlaku?
天蓬老师2017-05-02 09:26:08
Oleh kerana alamat yang ditunjukkan oleh p tidak berubah selepas dikeluarkan, jika sistem pengendalian tidak menuntut semula cebisan memori itu, tiada ralat akan dilaporkan jika anda terus mengaksesnya, iaitu penunjuk berjuntai.
p -----------------------------------> Orang {a: 10, reference_count: 1}
p -- hantar mesej keluaran kepada --> Orang {a: 10, reference_count: 1}
p ---------------------------------> Orang {a: 10, reference_count: 0} (deallocated)
p --------- dapatkan nilai a -------->
person* p = [[person alloc]init];
p.a = 10;
NSLog(@"%d", p.a);
[p release];
do {
NSLog(@"%d", p.a);
} while (TRUE);
Anda boleh lihat jika anda melaksanakannya beberapa kali, tiada corak langsung apabila ia digantung. . . Jadi bukanlah lebih baik untuk tidak terus melawat, pastinya tidak terus melawat. . .
- (void) dealloc
{
NSLog(@"dealloc person");
[super dealloc]; // 一定要有
}