تغيير القيم داخل NSArray عن طريق dereferencing؟
-
21-09-2019 - |
سؤال
لقد صادفت مشكلة تتعلق بالمؤشرات داخل المصفوفات في الهدف-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 مثل NSMutableData
'س mutableBytes
.
من الأفضل لك بناء مجموعة جديدة NS (قابلة للتغيير) مع القيم المعالجة.