سؤال

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

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

المحلول

MakeObjectSperformationSnector: سوف يعمل هذا المحدد ضد كل كائن في الصفيف. إذا تم تعديل هذه الكائنات من قبل المحدد، فسيتم تعديلها. لا يعيد أي شيء. الآن، هناك مصيد، والذي أنهما افتراضيا معظم النسخ في الكاكاو نسخ ضحل، مما يعني أنك تحصل على مجموعة جديدة، ولكن الكائنات الأساسية التي يشير إليها هي نفس الكائنات. ستحتاج إلى استخدام initwitharray: Copyitems لجعلها نسخ عناصر مستوى الجذر أيضا. إذا كنت تريد مجموعة جديدة تحتوي على الكائنات المعدلة وكذلك الصفيف القديم القيام بشيء مثل هذا:

NSArray *newArray = [[NSArray alloc] initWithArray:oldArray copyItems:YES];
[newArray makeObjectsPerformSelector:@selector(doSomethingToObject)];

نصائح أخرى

إذا كنت تستخدمه على صفيف، فهل سيتم تغيير الصفيف الموجود أو إرجاع واحد جديد؟

رقم.

أولا، اقرأ التوقيع:

- (void)makeObjectsPerformSelector:(SEL)aSelector

void, مع عدم وجود نجوم بعد ذلك، تعني "لا يعيد أي شيء".

ثانيا، لاحظ أن هذه طريقة NSArray، وهي فئة ثابتة. لذلك، makeObjectsPerformSelector: لا يتحول صفيف تلقي، لأن هذا مستحيل.

هناك nsmutablerray، وبما أن هذه فرعية من nsarray، فإنه يرث makeObjectsPerformSelector:. وبعد ومع ذلك، إذا تغير NSMutablerray سلوك هذه الطريقة، فإن وثائقها ستتاح لها قائمة خاصة به للطريقة (انظر العديد من التعاريف init في وثائق الطبقات المختلفة). لا توجد مثل هذه القائمة، حتى تتمكن من استنتاج ذلك بشكل صحيح) ذلك -[NSMutableArray makeObjectsPerformSelector:] يعمل بالضبط بنفس الطريقة كما -[NSArray makeObjectsPerformSelector:].

يمكن للكائنات تعديل نفسها استجابة لرسالتك، لكن الصفيف نفسه سيحتوي على نفس الكائنات بعد makeObjectsPerformSelector: كما كان قبل ذلك.

بالإضافة إلى إجابات أخرى، إذا كنت فعل نريد إنشاء مجموعة جديدة بنتيجة استدعاء الأسلوب، يمكنك القيام بذلك:

NSArray *derivedArray = [originalArray valueForKey:@"foo"];

هذا سوف فقط العمل إذا كانت الكائنات الخاصة بك يمكن أن تتعامل مع "-ValueForkey: @ رسالة" foo "ومن الواضح أنها مناسبة فقط للطرق التي لا تأخذ أي حجج وإرجاع قيمة غير نيل.

آمل أن أفسد هذا بشكل صحيح ...

إذا قمت بذلك [myarray makeoBjectsperformationsnector: someselector]، فأنت تكرار فقط من خلال myarray وإرسال رسالة المحددة إلى كل كائن. لم يتغير الصفيف لأن makeoBjectSperformation لا يسمح له بتغيير محتوياته.

لذلك في النهاية، لديك نفس الصفيف مع نفس الكائنات.

في المثال التالي، يمكنك أن ترى واحدة superView يتم إنشاؤه و 10 إضافة فرعية تضاف إليها، ثم أرسل كل واحد منهم removeFromSuperView (طريقة موجودة في view الطبقة) والنتيجة هي الصفر الفرعي في superView.

إذا كنت على دراية بجافا سكريبت ومحاولة العثور على شيء مثل map في جافا سكريبت، هذا ليس هكذا. map قم بتشغيل وظيفة على كل عنصر من عنصر الصفيف واستبداله بالنتيجة ولكن هنا makeObjectsPerformSelector تشغيل طريقة موجودة في كل كائن من الصفيف.

UIView* superView = [[UIView alloc] initWithFrame:CGRectZero];

for(int i = 0; i < 10; i++){
    UIView* view = [[UIView alloc] initWithFrame:CGRectZero];
    [superView addSubview:view];
}

NSLog(@"count = %lu", (unsigned long)[superView.subviews count]); // 10
[superView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; // removeFromSuperview is exist in `view`, you can call [view removeFromSuperview];
NSLog(@"count = %lu", (unsigned long)[superView.subviews count]); // 0
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top