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?
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 -------->
Seperti yang dinyatakan di atas, jika anda mahu ia menimbulkan masalah, teruskan mencuba sehingga sistem pengendalian menjadikannya hang (biasanya sangat cepat):
Saya tidak melihatnya tadi, dealloc juga perlu diubah suai: