Mengesan Kebocoran Memori dengan Instruments
Gunakan Xcode Instruments untuk mengenal pasti dan menyelesaikan kebocoran memori, kitaran pengekalan dan kesesakan prestasi berkaitan memori yang lain
Mengesan Kebocoran Memori dengan Instruments 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.
Apakah Kebocoran Memori?
Dalam Objective-C, kebocoran memori berlaku apabila aplikasi anda memperuntukkan memori untuk sesuatu objek, tetapi kemudiannya kehilangan semua rujukan kepada objek tersebut tanpa menyahperuntukkannya.
Ini bermaksud memori itu masih digunakan, tetapi aplikasi anda tidak lagi dapat mengakses atau membebaskannya. Lama-kelamaan, kebocoran boleh memperlahankan aplikasi anda dan malah menyebabkannya ranap.
Pengenalan kepada Xcode Instruments
Xcode Instruments ialah alat pemprofilan dan analisis berkuasa yang disediakan oleh Apple. Alat ini membantu pembangun memahami prestasi aplikasi mereka dalam pelbagai aspek, termasuk penggunaan CPU, penggunaan tenaga dan, yang paling penting, pengurusan memori.
Ia seolah-olah memberikan penglihatan sinar-X terhadap dalaman aplikasi anda!
Instrumen 'Leaks'
Antara banyak templatnya, Instruments menawarkan instrumen 'Leaks' khusus. Alat ini direka khas untuk mengesan dan menggambarkan kebocoran memori dalam aplikasi Objective-C anda.
Alat ini memantau peruntukan dan penyahperuntukan memori, serta menyerlahkan objek yang masih berada dalam memori tetapi tidak lagi boleh dicapai.
Membuat Profil Aplikasi untuk Mengesan Kebocoran
Untuk mula mengesan kebocoran, ikuti langkah berikut:
- 1. Dalam Xcode, pergi ke Product > Profile.
- 2. Xcode akan melancarkan Instruments. Pilih templat 'Leaks'.
- 3. Klik butang 'Choose'.
- 4. Dalam Instruments, klik butang 'Record' (bulatan merah) untuk mula menjalankan aplikasi anda.
Sekarang, berinteraksilah dengan aplikasi anda untuk cuba mencetuskan kebocoran yang berpotensi.
Mentafsir Graf Leaks
Semasa aplikasi anda berjalan, Instruments akan memaparkan graf garis masa. Cari bar merah yang muncul pada trek 'Leaks' – ini menunjukkan bahawa kebocoran memori telah dikesan pada ketika itu.
Ketinggian bar sering berkait dengan jumlah memori yang bocor atau bilangan objek yang bocor.
Menentukan Sumber Kebocoran
Untuk mengetahui di mana kebocoran berlaku:
- 1. Pilih bar merah (lonjakan kebocoran) pada garis masa.
- 2. Dalam anak tetingkap butiran di bawah, tukar kepada paparan 'Call Tree'.
- 3. Cari panggilan kaedah yang diserlahkan dengan warna merah atau ungu. Panggilan ini sering menunjukkan kod yang bertanggungjawab memperuntukkan objek yang bocor.
Jejak panggilan membantu anda menjejaki kembali baris kod yang tepat!
Punca Biasa: Kitaran Pengekalan
Punca kebocoran memori yang sangat biasa dalam Objective-C (terutamanya dengan ARC) ialah kitaran pengekalan (juga dikenali sebagai kitaran rujukan kuat).
Ini berlaku apabila dua objek atau lebih memegang rujukan kuat kepada satu sama lain lalu membentuk gelung tertutup. Oleh sebab setiap objek menganggap objek lain masih memerlukannya, tiada satu pun objek tersebut boleh dinyahperuntukkan, walaupun tidak lagi diperlukan oleh bahagian aplikasi yang lain.
Contoh: Kitaran Pengekalan
Berikut ialah contoh ringkas dua kelas, MyObject dan OtherObject, yang menghasilkan kitaran pengekalan. Perhatikan bahawa kedua-dua sifat ialah strong.
Jalankan kod ini. Anda akan melihat mesej 'initialized' tetapi tiada mesej 'deallocated', yang menunjukkan berlakunya kebocoran.
// MyObject.h
#import <Foundation/Foundation.h>
@class OtherObject;
@interface MyObject : NSObject
@property (strong, nonatomic) OtherObject *other; // Strong reference
- (instancetype)initWithName:(NSString *)name;
@end
// OtherObject.h
#import <Foundation/Foundation.h>
@class MyObject;
@interface OtherObject : NSObject
@property (strong, nonatomic) MyObject *my; // Strong reference
- (instancetype)initWithName:(NSString *)name;
@end
// MyObject.m
#import "MyObject.h"
#import "OtherObject.h"
@interface MyObject ()
@property (strong, nonatomic) NSString *name;
@end
@implementation MyObject
- (instancetype)initWithName:(NSString *)name {
self = [super init];
if (self) {
_name = name;
NSLog(@"MyObject %@ initialized", _name);
}
return self;
}
- (void)dealloc {
NSLog(@"MyObject %@ deallocated", self.name);
}
@end
// OtherObject.m
#import "OtherObject.h"
#import "MyObject.h"
@interface OtherObject ()
@property (strong, nonatomic) NSString *name;
@end
@implementation OtherObject
- (instancetype)initWithName:(NSString *)name {
self = [super init];
if (self) {
_name = name;
NSLog(@"OtherObject %@ initialized", _name);
}
return self;
}
- (void)dealloc {
NSLog(@"OtherObject %@ deallocated", self.name);
}
@end
// main.m
#import <Foundation/Foundation.h>
#import "MyObject.h"
#import "OtherObject.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"--- Starting Retain Cycle Demo ---");
MyObject *obj1 = [[MyObject alloc] initWithName:@"Object 1"];
OtherObject *obj2 = [[OtherObject alloc] initWithName:@"Object 2"];
// Create a strong, circular reference
obj1.other = obj2;
obj2.my = obj1;
NSLog(@"Objects created and linked. Notice no dealloc messages will appear.");
}
NSLog(@"--- Retain Cycle Demo Ended ---");
return 0;
}Memutuskan Kitaran Pengekalan dengan 'weak'
Untuk memutuskan kitaran pengekalan, salah satu rujukan dalam gelung itu mestilah 'weak', bukannya 'strong'. Rujukan weak tidak meningkatkan kiraan pengekalan objek, lalu membolehkan objek itu dinyahperuntukkan apabila tiada rujukan strong yang tinggal.
Jalankan contoh yang telah dibaiki ini. Kini anda akan melihat mesej 'deallocated', yang bermaksud tiada kebocoran!
// MyObject.h
#import <Foundation/Foundation.h>
@class OtherObject;
@interface MyObject : NSObject
@property (strong, nonatomic) OtherObject *other;
- (instancetype)initWithName:(NSString *)name;
@end
// OtherObject.h (FIXED: Using 'weak')
#import <Foundation/Foundation.h>
@class MyObject;
@interface OtherObject : NSObject
@property (weak, nonatomic) MyObject *my; // Weak reference to break the cycle
- (instancetype)initWithName:(NSString *)name;
@end
// MyObject.m
#import "MyObject.h"
#import "OtherObject.h"
@interface MyObject ()
@property (strong, nonatomic) NSString *name;
@end
@implementation MyObject
- (instancetype)initWithName:(NSString *)name {
self = [super init];
if (self) {
_name = name;
NSLog(@"MyObject %@ initialized", _name);
}
return self;
}
- (void)dealloc {
NSLog(@"MyObject %@ deallocated", self.name);
}
@end
// OtherObject.m
#import "OtherObject.h"
#import "MyObject.h"
@interface OtherObject ()
@property (strong, nonatomic) NSString *name;
@end
@implementation OtherObject
- (instancetype)initWithName:(NSString *)name {
self = [super init];
if (self) {
_name = name;
NSLog(@"OtherObject %@ initialized", _name);
}
return self;
}
- (void)dealloc {
NSLog(@"OtherObject %@ deallocated", self.name);
}
@end
// main.m
#import <Foundation/Foundation.h>
#import "MyObject.h"
#import "OtherObject.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"--- Starting Fixed Cycle Demo ---");
MyObject *obj1 = [[MyObject alloc] initWithName:@"Object 1"];
OtherObject *obj2 = [[OtherObject alloc] initWithName:@"Object 2"];
// Assign references. obj2 now has a weak ref to obj1.
obj1.other = obj2;
obj2.my = obj1;
NSLog(@"Objects created and linked. Now dealloc messages should appear!");
}
NSLog(@"--- Fixed Cycle Demo Ended ---");
return 0;
}Semakan Pantas: Pengesanan Kebocoran
Anda mendapati aplikasi Objective-C anda semakin perlahan dari semasa ke semasa dan menggunakan lebih banyak memori daripada yang dijangkakan. Anda mengesyaki terdapat kebocoran memori.
Imbas Kembali: Menguasai Memori
Anda telah mempelajari bahawa kebocoran memori menghalang objek daripada dinyahperuntukkan, lalu menyebabkan masalah prestasi. Xcode Instruments, khususnya templat 'Leaks', ialah alat utama anda untuk mengenal pasti masalah ini.
Punca yang lazim ialah kitaran pengekalan, iaitu keadaan apabila objek saling merujuk antara satu sama lain dengan kuat. Anda boleh memutuskan kitaran ini dengan menggunakan rujukan weak (@property (weak, nonatomic)) bagi memastikan pengurusan memori yang betul.
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 “Mengesan Kebocoran Memori dengan Instruments” percuma?
Ya — teks penuh “Mengesan Kebocoran Memori dengan Instruments” 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 “Mengesan Kebocoran Memori dengan Instruments”?
Gunakan Xcode Instruments untuk mengenal pasti dan menyelesaikan kebocoran memori, kitaran pengekalan dan kesesakan prestasi berkaitan memori yang lain 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 “Mengesan Kebocoran Memori dengan Instruments” 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
- Mengesan Kebocoran Memori dengan Instruments
- Mengoptimumkan Pemaparan UI dan Responsif
- Teknik Penyahpepijatan Lanjutan
- Menganalisis dan Mengurangkan Masa Pelancaran Aplikasi