შინაარსზე გადასვლა

Objective-C/კლასის იმპლემენტაცია

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

მოდით დავამატოთ იმპლემნტაცია. დავიწყოთ მნიშვნელობის მიმღები მეთოდებით:

#import "Photo.h"

@implementation Photo
    
- (NSString*) caption {
    return caption;
}

- (NSString*) photographer {
    return photographer;
}

@end

კოდის ეს ნაწილი იწყება @implementation და კლასის სახელით, და აქვს @end, როგორც ინტერფეისს. ყველა მეთოდი ამათ შორის უნდა მოთავსდეს.

ეს მეთოდები უნდა ნაცნობი იყოს თქვენთვის, თუ ოდესმე დაგიწერიათ პროგრამა.

მოდით ახლა განვიხილოთ მნიშვნელობის მინიჭების ნაწილი, რომელიც მოითხოვს მეტ ახსნას:

- (void) setCaption: (NSString*)input
{
    [caption autorelease];
    caption = [input retain];
}

- (void) setPhotographer: (NSString*)input
{
    [photographer autorelease];
    photographer = [input retain];
}

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

- (void) setCaption: (NSString*)input {
    caption = input;
}

მაგრამ თუ თქვენ ვერ იყენებთ მეხსიერების ავტომატურ მართვას, თქვენ უნდა გაასუფთაოთ ძველი ობიექტი და შეინარჩუნოთ ახალი.

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

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

ეს შესაძლებელია დამაბნეველი ჩანდეს, თუმცა ჩვენ მოგცემთ შემდგომ განმარტებებს მომდევნო თავებში.

ჩვენ შეგვიძლია init მეთოდის შექმნა, რათა მივანიჭოთ საწყისი მნიშვნელობები ეგზემპლარის ცვლადებს:

- (id) init
{
    if ( self = [super init] )
    {
        [self setCaption:@"Default Caption"];
        [self setPhotographer:@"Default Photographer"];
    }
    return self;
}

ეს კოდი თავისთავად ადვილი აღსაქმელია, თუმცა მეორე ხაზი შეიძლება გაუგებრად მოგეჩვენოთ. ეს არის ერთჯერადი ტოლობის ნიშანი, რომელიც ანიჭებს [super init]-ის მნიშვნელობას self-ს.

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

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

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

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

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

dealloc მეთოდი არ გამოიძახება თუ მეხსიერების ავტომატური გაწმენდაა ჩართული ამის მაგიერ თქვენ გამსაზღვრავთ finalize მეთოდს.