როდესაც ჩვენ ვწერდით აცესორ მეთოდებს ფოტოს წარწერისთვის (caption) და ავტორისთვის (author), თქვენ ალბათ მიაქციეთ ყურადღება, რომ კოდი იყო საკმაოდ ერთფეროვანი, და შესაძლოა ყოფილიყო განზოგადებული.

თვისებები არის Objective-C-ს შესაძლებლობა, რომელიც გვაძლევს საშუალებას აცესორების ავტომატური გენერაციისა, და გარდა ამისა ჩვენ გვაქვს სხვა უპირატესობებიც. მოდით შეცვალოთ Photo კლასი თვისებების გამოყენებით.

აი როგორ გამოიყურებოდა ის აქამდე:

#import <Cocoa/Cocoa.h>

@interface Photo : NSObject {
    NSString* caption;
    NSString* photographer;
}
- (NSString*) caption;
- (NSString*) photographer;

- (void) setCaption: (NSString*)input;
- (void) setPhotographer: (NSString*)input;

@end

აი როგორ გამოიყურება ის თვისებების გამოყენებით:

#import <Cocoa/Cocoa.h>

@interface Photo : NSObject {
    NSString* caption;
    NSString* photographer;
}
@property (retain) NSString* caption;
@property (retain) NSString* photographer;

@end

@property არის Objective-C-ს დირექტივა, რომელიც აცხადებს თვისებას. "retain" ფრჩხილებში მიუთითებს, რომ მნიშვნელობის მიმყენებლემა მეთოდმა უნდა შეინარჩუნოს შემომავალი სიდიდე, ხოლო დარჩენილი ნაწილი მიუთითებს თვისების ტიპს და სახელს.

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

#import "Photo.h"
        
@implementation Photo

@synthesize caption;
@synthesize photographer;

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

@end

@synthesize დირექტივა ავტომატურად აგენერირებს მნიშვნელობის მიმღებ და დამყენებელ ფუნქციებს, ასე რომ ერთადერთი რაც გვრჩება არის init და dealloc მეთოდების განსაზღვრა.

აცესორები მხოლოდ მაშინ დაგენერირდება, თუ ისინი ჯერ არ არსებობენ. ასე რომ შეგიძლიათ @synthesize-ს მითითება თვისებისთვის და შემდეგ დაწეროთ სპეციფიური მნიშვნელობის მიმღები ან/და დამყენებელი, თუ ამის სურვილი გაქვთ. კომპილატორი მხოლოდ იმ მეთოდებს შეავსებს, რომელიც თქვენ გამოტოვეთ.

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