ما هي أفضل طريقة لاستخدام خصائص Obj-C 2.0 مع الكائنات القابلة للتغيير، مثل NSMutableArray؟

StackOverflow https://stackoverflow.com/questions/816720

سؤال

لدي فئة Obj-C 2.0 تحتوي على خاصية NSMutableArray.إذا استخدمت الكود التالي، فإن أداة الضبط المركبة ستعطيني نسخة غير قابلة للتغيير، وليست نسخة قابلة للتغيير:

@property (readwrite, copy) NSMutableArray *myArray;

هل هناك أي سبب لعدم قيام Apple بتنفيذ بناء الجملة التالي؟

@property (readwrite, mutablecopy) NSMutableArray *myArray;

وبما أننا لا نملك mutablecopy, ما هي أفضل طريقة للتعامل مع هذا الموقف (الذي يبدو شائعًا)؟هل يجب أن أكتب أداة الضبط الخاصة بي التي تقوم بـ -mutableCopy؟

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

المحلول

وكما ذكرت من قبل، و<م> الطريق الصحيح للقيام بذلك ليست لجعل مجموعة قابلة للتغيير خاصية. هناك تفسير كبير من ما يجب أن تنفذ لتكون متوافقة KVC <لأ href = "http://boredzo.org/blog/archives/2008-11-26/how-to-work-with-a-bound-to- مجموعة "يختلط =" نوفولو noreferrer "> هنا .

نصائح أخرى

وأنا واجهت نفس المشكلة منذ بعض الوقت وجدت <لأ href = "http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#// apple_ref / وثيقة / رمز المستخدم / TP30001163-CH17-SW17 "يختلط =" noreferrer "> وثيقة على أبل المطور اتصال التوصية لتوفير تنفيذ الخاص بك من واضع. تشكل نموذج التعليمات البرمجية المستند المرتبط:

@interface MyClass : NSObject {
    NSMutableArray *myArray;
}
@property (nonatomic, copy) NSMutableArray *myArray;
@end

@implementation MyClass

@synthesize myArray;

- (void)setMyArray:(NSMutableArray *)newArray {
    if (myArray != newArray) {
        [myArray release];
        myArray = [newArray mutableCopy];
    }
}

ليس من الشائع أن تمر NSMutableArrayق في الكاكاو.تتمثل ممارسة الكاكاو القياسية في تنفيذ التوافق مع ترميز القيمة الرئيسية طُرق لخاصية مفهرسة للعديد من الممتلكات.وهذا له فائدتان:

  1. تعمل مراقبة القيمة الأساسية كما هو متوقع (هناك العديد من الحالات التي تؤدي فيها مراقبة NSMutableArray إلى سلوك غير ما تريده)
  2. يتم إخفاء تنفيذ بنية البيانات الخاصة بك لأنك تكشف عن طرق التحوير (على سبيل المثال. -[MyObject insertObjectInMyProperty:(id)newObject atIndex:(NSUInteger)i] وليس بنية البيانات نفسها.

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

وسيكون لديك لكتابة اضع الخاصة بك.

والطريقة الصحيحة لالابقاء على NSMutableArray هي مع خاصية الاحتفاظ:

@property (nonatomic, retain) NSMutableArray *myArray;

وأنت لا تحتاج لكتابة اضع أو استخدام الخاص بك نسخة. يجب استخدام الخاصية نسخة مع NSArray التي لا تحتاج بالفعل ليتم نسخها عندما يتم التقاط الملكية إلى كائن آخر. على سبيل المثال، إذا قمت بتعيين كائن NSMutableArray إلى الممتلكات التي هي من نوع NSArray مع الخاصية نسخة، فإنك لا تريد أن تجعل من نسخة من مجموعة قابلة للتغيير إلى "الاستيلاء" على أنها ممتلكات ثابتة من تلك النقطة.

ومارك لديه النهج الصحيح، فإن المرء لا تجعل عادة NSMutableArray جزء من API العام من الأشياء الخاصة بك. إذا كان لديك على الممتلكات العامة، فإنه يمكن أن يكون NSArray مع الخاصية نسخة.

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