Objektif-c - Bolehkah pembolehubah objek Objektif-c diakses selepas ia dikeluarkan?
大家讲道理
大家讲道理 2017-05-02 09:24:08
0
1
612

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:

  1. Mengapa saya boleh terus mengaksesnya selepas [p keluaran] dan mengapa tiada ralat dilaporkan?

  2. Cadangannya ialah sebaik-baiknya jangan teruskan mengakses selepas dikeluarkan. Jika anda boleh mengaksesnya, dalam keadaan apakah masalah akan berlaku?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(1)
Peter_Zhu

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):

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. . .


Saya tidak melihatnya tadi, dealloc juga perlu diubah suai:

- (void) dealloc
{
    NSLog(@"dealloc person");
    
    [super dealloc]; // 一定要有
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan