cari

Rumah  >  Soal Jawab  >  teks badan

Objektif-c - Bolehkah pembolehubah objek Objektif-c diakses selepas ia dikeluarkan?

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?

大家讲道理大家讲道理2870 hari yang lalu639

membalas semua(1)saya akan balas

  • 天蓬老师

    天蓬老师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 -------->


    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]; // 一定要有
    }

    balas
    0
  • Batalbalas