سؤال

أحد الأشياء التي كنت أعاني منها ، أثناء اقتحام برمجة Objective-C ، هو فهم كيفية معالجة الخصائص. ربما أكون خارج منطقة الراحة الخاصة بي باستخدام لغة الترميز المناسبة بدلاً من لغات البرمجة النصية التي اعتدت عليها ، وبالتالي فإن إعلان الأشياء في ملفات الرأس وملفات التنفيذ يربكني إلى حد ما.

دعنا نقول أن لدي سلسلة. أرغب في إضافة بعض النص إلى هذه السلسلة. ماذا أعلن في ملف الرأس وماذا أفعل في ملف التنفيذ للسماح لهذا العمل بشكل صحيح ، وما هي property و synthesize؟

هل كانت مفيدة؟

المحلول

في الأيام الخوالي السيئة قبل الهدف-C 2.0 ، كان من الشائع كتابة getters والمستقبين لمتغيرات المثيل على سبيل المثال

@interface Foo : NSObject
{
@private 
    id foo;
}
-(void) setFoo: (id) newFoo;
-(id) foo;
@end

@implementation Foo

// need dealloc to release foo too.

-(void) setFoo: (id) newFoo
{
    [newFoo retain];
    [foo release];
    foo = newFoo;
}

-(id) foo
{
   return foo;
}
@end

وهذا فقط في البيئة الخيطية الواحدة. كان هناك المزيد من الأشياء اللازمة لتطبيقات Multithed.

توفر الخصائص اختصارًا أنيقًا لما سبق. يحل property محل كل من الإعلانات في الواجهة بالإضافة إلى إعطاء المتصل تلميحات أفضل حول دلالات getter و setter. كما يتيح لك @synthesize أدوات الوصول بحيث يقوم المترجم بإنشاء الكود لهم تلقائيًا (لا تفعل ذلك لديك إلى synthesize لهم ، يمكنك توفير تطبيقاتك الخاصة إذا كنت تريد). يمكن استبدال كل ما سبق

 @interface Foo : NSObject
{
@private 
    id foo;
}
@property (nonatomic, retain) id foo;
@end

@implementation Foo

// need dealloc to release foo too.

@synthesize foo; 
@end

هذا يوفر الكثير من الكتابة ولكن يمكنك أيضًا أن ترى من الواجهة التي SetFoo: سيحتفظ بقيمته الجديدة وأن الخاصية غير آمنة للاستخدام (لتعيين أو احصل على) في بيئة متعددة مؤشرات الترابط (بدون بعض آلية قفل أخرى).

نصائح أخرى

@property - يعلن خاصية مع معدلات الوصول والذاكرة. يمكن قراءة الخصائص أو القراءة أو غير الذرية أو الذرية (سلامة الخيط) ، تعيين/الاحتفاظ/النسخ المدارة. في الواقع ، يمكنك الإعلان عن أساليب Getter و Setter البسيطة كما فعلنا في عصر النمر ، ولكن إعلان أ @property سوف تساعدك على تحديد جميع جوانب العقار في أي وقت دون التحقق من التنفيذ.

@تركيب - يبسط الوظيفة إذا كنت بحاجة إلى خاصية بسيطة دون أي وظيفة معقدة في Getter و Setter. يحدد التنفيذ الافتراضي وفقًا لتعريف @property.

أخيرًا ، أسئلتك حول السلسلة. لن تساعد الخصائص هنا إذا كنت تبحث عن شيء بسيط ، فلنقول myObj.string += "abc". إنه ليس نمطًا هائلاً-مع أو بدون عقار ، ستقوم بشيء مثل myObj.string = [[myObj string] stringByAppendingString:@"abc"] أو [[myObj string] appendString:@"abc"] اعتمادا على الطبيعة القابلة للتغيير/غير القابلة للتغيير لكائن السلسلة.

كخلاصة القاع: إنه موضوع كبير لشرح كل شيء في منشور واحد. أوصيك بقراءة وثائق Apple وربما شراء كتاب حول الهدف-C. كتب آرون هيليجاس واحدًا - بداية جيدة لأي مبتدئ من الهدف -C و Mac OS X.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top