سؤال

لقد صادفت مشكلة تتعلق بالمؤشرات داخل المصفوفات في الهدف-C.

ما أحاول القيام به هو أخذ المؤشرات داخل nsarray ، ونقلها إلى طريقة ، ثم تعيين القيمة التي تم إرجاعها إلى المؤشر الأصلي (المؤشر الذي ينتمي إلى الصفيف).

استنادًا إلى ما أعرفه من C و C ++ ، من خلال إزالة المؤشرات داخل الصفيف ، يجب أن أكون قادرًا على تغيير القيم التي تشير إليها ... هنا هو الرمز الذي أستخدمه ، لكنه لا يعمل (هاتف القيمة يشير إلى عدم التغييرات أبدًا بناءً على إخراج NSLog).

NSArray *phoneNumbers = [phoneEmailDict objectForKey:@"phone"];
    for (NSString* phone in phoneNumbers) {
        (*phone) = (*[self removeNonNumbers:phone]);
        NSLog(@"phone:%@", phone);
    }

وهنا هو توقيع الأسلوب الذي أقوم بتمرير NSString* إلى:

- (NSString*) removeNonNumbers: (NSString*) string;

كما ترون ، أنا أكرر من خلال كل nsstring* داخل phonenumbers مع الهاتف المتغير. أقوم بتمرير الهاتف إلى Removenonnumbers: الذي يعيد NSString المعدل*. بعد ذلك ، أعيد إرجاع المؤشر من removenonnumber وتعيين القيمة إلى الهاتف.

كما يمكنك أن تقول ، ربما لا أفهم كائنات Objective-C بشكل جيد. أنا متأكد من أن هذا سيعمل في C ++ أو C ، لكن لا يمكنني رؤية سبب عدم عمله هنا! شكرا مقدما لمساعدتكم!

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

المحلول

نعم ، هذا لن ينجح. ستحتاج إلى NSMutableArray:

NSMutableArray * phoneNumbers = [[phoneEmailDict objectForKey:@"phone"] mutableCopy];
for (NSUInteger i = 0; i < [phoneNumber count]; ++i) {
  NSString * phone = [phoneNumbers objectAtIndex:i];
  phone = [self removeNonNumbers:phone];
  [phoneNumbers replaceObjectAtIndex:i withObject:phone];
}
[phoneEmailDict setObject:phoneNumbers forKey:@"phone"];
[phoneNumbers release];

نصائح أخرى

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

NSArray ليس صفيف نمط C/C ++. إنه كائن موضوعي. تحتاج إلى استخدام طرق مثيل التابع NSArray فئة لأداء العمليات عليها.

في الهدف-C أنت لا "dereference" مؤشر كائن لتعيين قيمته.

أيضًا ، أنت تستخدم ما يسمى التعداد السريع, والتي لا تسمح طفرة.

تستطيع ايضا استخذام requerateObjectsusingBlock:.

NSArray *array = [NSArray array];
__block NSMutableArray *mutableCopyArray = [array mutableCopy];
[mutableCopyArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
    [mutableCopyArray replaceObjectAtIndex:idx withObject:[object modifiedObject]];
}];

الدفع كيف أتكرر على nsarray؟

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

لذلك عندما يتعلق الأمر بذلك ، فلن تعرف حقًا ما تتعامل معه داخليًا. تم تصميم Nsarray فعليًا ليكون ثابتًا ، لذا فإن التحرير في مكانه يعد فكرة سيئة بشكل مضاعف.

الكائنات المصممة للسماح لك بالتعبئة مع الكائنات الداخلية تعرض تلك من خلال أساليب API مثل NSMutableDatamutableBytes.

من الأفضل لك بناء مجموعة جديدة NS (قابلة للتغيير) مع القيم المعالجة.

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