Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan · Pelajaran

Asas Pengekalan-Pelepasan Manual (MRR)

Fahami prinsip pengurusan memori manual, termasuk retain, release dan kumpulan autorelease.

Pelajaran 1 daripada 411 langkah

Asas Pengekalan-Pelepasan Manual (MRR) ialah pelajaran Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan merangkumi sejumlah 4 pelajaran.

Selamat Datang ke Pengurusan Memori

Dalam Objective-C, pengurusan memori amat penting untuk aplikasi yang cekap dan stabil. Sebelum Automatic Reference Counting (ARC) menjadi standard, pembangun mengurus memori secara manual menggunakan sistem yang dipanggil Manual Retain-Release (MRR).

Memahami MRR membantu anda bekerja dengan pangkalan kod lama dan memahami asas cara ARC berfungsi di sebalik tabir.

Apakah Pengiraan Rujukan?

MRR berasaskan pengiraan rujukan. Setiap objek mempunyai "retain count", iaitu integer yang menjejak bilangan "pemilik" semasa sesuatu objek.

  • Apabila objek dicipta, retain countnya ialah 1.
  • Apabila objek mendapat pemilik, retain countnya meningkat.
  • Apabila objek kehilangan pemilik, retain countnya menurun.
  • Apabila retain count turun kepada 0, objek dinyahperuntukkan (dimusnahkan).

Mengambil Pemilikan dengan `retain`

Untuk menunjukkan bahawa anda mahu menyimpan objek dalam memori, anda menghantar mesej retain kepadanya. Ini meningkatkan retain count sebanyak satu.

Anggaplah ia seperti berkata, "Saya memerlukan objek ini, jangan biarkan ia hilang dahulu!"

Cuba jalankan contoh ini:

#import <Foundation/Foundation.h>

@interface MyObject : NSObject
@end

@implementation MyObject
- (id)init {
    self = [super init];
    if (self) {
        NSLog(@"MyObject created. Retain count: %lu", [self retainCount]);
    }
    return self;
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyObject *obj = [[MyObject alloc] init]; // Retain count is 1
        [obj retain]; // Retain count becomes 2
        NSLog(@"After retain: %lu", [obj retainCount]);

        // Note: We'll learn about 'release' soon!
    }
    return 0;
}

Melepaskan Pemilikan dengan `release`

Apabila anda tidak lagi memerlukan objek yang anda miliki, anda mesti menghantar mesej release kepadanya. Ini mengurangkan retain count sebanyak satu.

Jika retain count turun kepada sifar, objek dinyahperuntukkan dan memorinya dibebaskan. Kegagalan melepaskan objek yang anda miliki akan menyebabkan kebocoran memori.

#import <Foundation/Foundation.h>

@interface MyObject : NSObject
@end

@implementation MyObject
- (id)init {
    self = [super init];
    if (self) {
        NSLog(@"MyObject created. Retain count: %lu", [self retainCount]);
    }
    return self;
}
- (void)dealloc {
    NSLog(@"MyObject deallocated.");
    [super dealloc]; // Always call super's dealloc
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyObject *obj = [[MyObject alloc] init]; // Retain count 1
        [obj retain]; // Retain count 2
        NSLog(@"After retain: %lu", [obj retainCount]);

        [obj release]; // Retain count 1
        NSLog(@"After first release: %lu", [obj retainCount]);
        [obj release]; // Retain count 0, object deallocated
    }
    return 0;
}

Penjelasan Kaedah `dealloc`

Kaedah dealloc ialah kaedah khas yang dipanggil secara automatik apabila retain count objek mencapai sifar, sejurus sebelum memorinya dituntut semula.

Anda melaksanakan dealloc dalam class tersuai untuk melakukan tugas pembersihan, seperti melepaskan pemboleh ubah tika yang anda miliki, mengalih keluar pemerhati atau menutup pemegang fail.

#import <Foundation/Foundation.h>

@interface MyClass : NSObject {
    NSString *_name;
}
- (id)initWithName:(NSString *)name;
@end

@implementation MyClass
- (id)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = [name retain]; // Retain the name string
        NSLog(@"MyClass '%@' initialized. Retain count: %lu", _name, [self retainCount]);
    }
    return self;
}

- (void)dealloc {
    NSLog(@"MyClass '%@' is being deallocated.", _name);
    [_name release]; // Release instance variables you own
    _name = nil;     // Set to nil to prevent dangling pointers
    [super dealloc]; // Always call super's dealloc LAST
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyClass *myObject = [[MyClass alloc] initWithName:@"Coddy"];
        // Do something with myObject
        [myObject release]; // Release the object when done
    }
    return 0;
}

Peraturan Pemilikan MRR

Peraturan utama MRR adalah mudah:

  • Anda memiliki mana-mana objek yang anda cipta (menggunakan alloc, new, copy atau mutableCopy).
  • Anda memiliki mana-mana objek yang anda retain secara jelas.
  • Anda mesti release mana-mana objek yang anda miliki apabila anda selesai menggunakannya.

Jika anda menerima objek daripada kaedah yang tidak bermula dengan "alloc", "new", "copy" atau "mutableCopy", biasanya anda tidak memilikinya dan tidak patut melepaskannya (melainkan anda mengekalkannya secara jelas).

Memperkenalkan `autorelease`

Adakalanya, anda perlu mengembalikan objek daripada kaedah, tetapi tidak mahu pemanggil perlu melepaskannya serta-merta. Di sinilah autorelease digunakan.

Apabila anda menghantar mesej autorelease kepada objek, retain countnya dikurangkan pada suatu ketika kemudian, biasanya apabila kolam autorelease semasa dikosongkan.

Ia seperti berkata, "Saya sudah selesai menggunakannya, tetapi jangan nyahperuntukkannya dahulu; biarkan sistem mengurus pelepasan akhirnya."

Bekerja dengan Kolam Autorelease

autorelease berfungsi dengan NSAutoreleasePool. Objek yang ditandakan sebagai autorelease ditambahkan pada kolam semasa. Apabila kolam itu "dikosongkan", semua objek di dalamnya menerima mesej release.

Dalam Objective-C moden, anda menggunakan sintaks blok @autoreleasepool. Ini memastikan objek sementara dilepaskan dengan cekap dan menghalang pengumpulan memori.

#import <Foundation/Foundation.h>

@interface MyObject : NSObject
@end

@implementation MyObject
- (id)init {
    self = [super init];
    if (self) {
        NSLog(@"MyObject created.");
    }
    return self;
}
- (void)dealloc {
    NSLog(@"MyObject deallocated.");
    [super dealloc];
}
@end

MyObject *createAndAutoreleaseObject() {
    MyObject *obj = [[MyObject alloc] init];
    NSLog(@"Object retain count before autorelease: %lu", [obj retainCount]);
    return [obj autorelease]; // Defer release until pool drains
}

int main(int argc, const char * argv[]) {
    NSLog(@"Before autoreleasepool block");
    @autoreleasepool {
        NSLog(@"Inside autoreleasepool block");
        MyObject *a = createAndAutoreleaseObject();
        // 'a' is valid here
        NSLog(@"Object retain count after autorelease: %lu", [a retainCount]);
    }
    NSLog(@"After autoreleasepool block. Object should be deallocated.");
    return 0;
}

Amalan Terbaik MRR

Menulis kod MRR yang betul memerlukan disiplin:

  • Seimbangkan panggilan `retain` dan `release`: Bagi setiap retain, alloc, new, copy atau mutableCopy, mesti ada release atau autorelease yang sepadan.
  • Jangan lakukan pelepasan secara berlebihan: Melepaskan objek lebih banyak kali daripada objek itu dikekalkan akan menyebabkan aplikasi ranap.
  • Lepaskan pemboleh ubah tika dalam `dealloc`: Pastikan anda melepaskan mana-mana objek yang anda kekalkan sebagai pemboleh ubah tika.
  • Panggil `[super dealloc]` pada akhir: Dalam kaedah dealloc anda, sentiasa panggil dealloc kelas induk pada penghujung sekali.

Semakan Konsep MRR

Pertimbangkan petikan kod Objective-C berikut:


NSString *myString = [[NSString alloc] initWithFormat:@"Hello"];
[myString retain];
// ... some operations ...
[myString release];
// ... more operations ...
[myString release];

Apakah keadaan akhir myString selepas kedua-dua panggilan release, dengan andaian ia bermula dengan kiraan retain sebanyak 1 daripada alloc?

Imbas Kembali: Asas MRR

Anda telah meneroka prinsip teras Manual Retain-Release (MRR):

  • Pengiraan Rujukan: Objek menjejaki pemilikan menggunakan kiraan retain.
  • `retain`: Meningkatkan kiraan retain objek, yang menunjukkan pemilikan.
  • `release`: Mengurangkan kiraan retain objek; objek dinyahperuntukkan apabila kiraan mencapai 0.
  • `dealloc`: Kaedah khas untuk pembersihan apabila objek dimusnahkan.
  • `autorelease`: Menangguhkan pelepasan objek sehingga kumpulan autorelease dikosongkan.

Menguasai asas ini penting untuk memahami kod Objective-C legasi dan mekanisme asas pengurusan memori moden!

Percuma untuk bermula

Pelajari Objective-C dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “Asas Pengekalan-Pelepasan Manual (MRR)” percuma?

Ya — teks penuh “Asas Pengekalan-Pelepasan Manual (MRR)” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan, tingkat taraf kepada CoddyKit PRO. Kursus Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Asas Pengekalan-Pelepasan Manual (MRR)”?

Fahami prinsip pengurusan memori manual, termasuk retain, release dan kumpulan autorelease. Anda berlatih Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Asas Pengekalan-Pelepasan Manual (MRR)” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan ini?

Ya. Setiap pelajaran Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Asas Pengekalan-Pelepasan Manual (MRR)
  2. Pengiraan Rujukan Automatik (ARC)
  3. Rujukan Lemah berbanding Kuat
  4. Memutuskan Kitaran Pegangan dalam Blok
← Kembali ke Pembangunan Objective-C untuk Aplikasi iOS Lama dan Perusahaan