Objective-C/მეტი მეხსიერების მართვაზე

ვიკიწიგნებიდან

Objective-C-ს მეხსიერების მართვში გამოიყენება რეფერენსების თვლა. ერთადერთი რაც თქვენ გევალებათ არის სწორად დათვალოთ თქვენი რეფერენსი, მეხსიერების ნამდვილ გასუფთავებას კი შესრულების გარემო გააკეთებს.

უმარტივესად რომ ავხსნათ, თვენ უკეთებთ თქვენ ობიექტს ალოკაციას (alloc მეთოდი), შესაძლოა ინარჩუნებთ მას (retain მეთოდი) შემდეგ ახორციელებთ იმდენ release-ს რამდენიც alloc/retain გააგზავნეთ. ასე რომ, თუ თქვენ ერთხელ გამოიყენეთ alloc, და ერთხელაც retain, მაშინ თქვენ უნდა გააგზავნოთ ორი release გზავნილი.

ეს არის რეფერენსების თვლის თეორია. თუმცა პრაქტიკაში, თქვენ გაქვთ ობიექტის შექმნის მხოლოდ ორი მიზეზი:

  1. შეინახოთ ის ეგზმპლარის ცვლადად
  2. გამოიყენოთ დროებითად ერთჯერადი გამოყენებისთვის რომელიმე ფუნქციის შიგნით

უმეტესობა შემთხვევაში მნიშნველობის მიმნიჭებელი ობიექტი უნდა აგზავნიდეს autorelease-ს ძველი ობიექტისთვის და ინარჩუნებდეს ახალს. თვენ შემდეგ აგრეთვე ათავისუფლებთ (release) მას dealloc მეთოდში.

ასე რომ ერთადერთი სამუშაო რჩება, ესაა ლოკალური რეფერენსების მართვა ფუნქციის შიგნით. და აქ მხოლოდ ერთი წესია: თუ თქვენ ქმნით ობიექტს alloc ან copy-ს მეშვეობით, გაუგზავნეთ მას release ან autorelease გზავნილი ფუნქციის ბოლოს. თუ თქვენ ქმნით ობიექტს სხვა მეთოდით, არ გააკეთოთ არაფერი.

აქ არის პირველი შემთხვევა ეგზემპლარის ცვლადის მართვის:

- (void) setTotalAmount: (NSNumber*)input
{
    [totalAmount autorelease];
    totalAmount = [input retain];
}

- (void) dealloc
{
    [totalAmount release];
    [super dealloc];
}

აქ არის სხვა შემთხვევა, ლოკალური რეფერენსი. ჩვენ მხოლოდ იმ ობიექტს ვათავისუფლებთ (release), რომელიც შექმნილია alloc-ის გამოყენებით:

NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];
NSNumber* value2 = [NSNumber numberWithFloat:14.78];

// ვათავისუფლებთ value1, არა value2
[value1 release];

და შერეული მაგალითი: ლოკალური რეფერენსის გამოყენება როგორც ეგზემპლარის ცვლადის:

NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];
[self setTotal:value1];

NSNumber* value2 = [NSNumber numberWithFloat:14.78];
[self setTotal:value2];

[value1 release];

დააკვირდით, რომ ლოკალური რეფერენსების მართვის წესები ზუსტად ერთნაირია, მიუხედავად იმისა ვანიჭებთ თუ არა ჩვენ მათ ეგზემპლარის ცვლადს. თქვენ არ გჭირდებათ იფიქროთ იმაზე თუ როგორაა განხორციელებული მნიშვნელობის მიმნიჭებელი ფუნქცია ამ ობიექტისთვის.

თუ თქვენ ეს გაიგეთ, მაშინ თქვენ გაიგეთ 90% იმისა თუ რაც ოდესმე დაგჭირდებათ Objective-C-ს მეხსიერების მართვაზე.