الممتلكات والفئة الممتدة والارتباك بين الواجهة
-
19-09-2019 - |
سؤال
لقد قمت بتنزيل نموذج رمز مخطط مؤامرة AA.
واحد من ملفات .h:
@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> {
CPLayerHostingView *layerHost;
@private
APYahooDataPuller *datapuller;
CPXYGraph *graph;
}
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost;
@end
في ملف .m تم إعلان الواجهة مرة أخرى؟
@interface MainViewController()
@property(nonatomic, retain) CPXYGraph *graph;
@property(nonatomic, retain) APYahooDataPuller *datapuller;
@end
لقد وجدت التعليمات البرمجية أعلاه في نموذج وحدة تحكم العرض الرئيسية للعينة.
إذا قمت بذلك، ما سيكون الفرق بين الكود أعلاه والرمز أدناه?
@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> {
CPLayerHostingView *layerHost;
APYahooDataPuller *datapuller;
CPXYGraph *graph;
}
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost;
@property(nonatomic, retain) CPXYGraph *graph;
@property(nonatomic, retain) APYahooDataPuller *datapuller;
@end
المحلول
الأشياء "الإضافية" التي تراها في ملف .m هو الفئة. وبعد من المحتمل أن يكون المبرمج الأصلي قد أراد فقط إخفاء بعض تفاصيل تنفيذه من الواجهة العامة لفصله (في ملف .h)، لذلك قام بإجراء فئة (عديمة النظر في هذه الحالة، ولهذا السبب لا يوجد شيء داخل ()
) لإضافة لهم في ملف تنفيذه. في هذه الحالة المحددة، يخفي الملحقات لمتغيراته الخاصة بحيث لا يمكن أن يحصل عليه الرمز الخارجي.
التغييرات التي تظهرها في مقتطف الرمز الثاني الخاص بك وضع كل شيء في واجهة فئة واحدة. يجب ألا تؤثر هذه التغييرات على تشغيل وقت التشغيل على الإطلاق. (إلا أنك أخرجت @private
, ، هل كان ذلك عن قصد؟) الفرق الدلالي هو أن طرق الفئة تضاف إلى الفصل في وقت التشغيل.
يمكن للفئات إضافة طرق فقط، وليس المتغيرات المثلية، وهذا هو السبب في أن الكود الأصلي يحتوي على كل الإعلانات المتغيرة المثيل (حتى أولئك الذين لديهم "السرية") في الأصل @interface
منع.