الهدف C / iPhone: هل من الممكن إعادة تهيئة nsarray؟
-
20-09-2019 - |
سؤال
قرأت أن أنواع البيانات غير القابلة للتغيير لا يمكن تعديلها ذات مرة. (مثل NSSTRING أو NSARRAY).
ولكن هل يمكن إعادة تهيئة لإشارة إلى مجموعة مختلفة من الكائنات؟
إذا كان الأمر كذلك، فهل يمكنني استخدام الإفراج عن أي ALLOC من أول مرة جولة بين الاستخدامات بين الاستخدامات؟ على سبيل المثال:
أعلن Myarriay باسم NSArray * Myarray Interface، وكما يتم تعيين خاصية غير مرتبطة / الاحتفاظ بها. تعيين Myarray في رمز التهيئة إلى حد ما إلى مجموعة من السلاسل كما يلي.
self.myArray = [myString componentsSeparatedByString:@","];
ولكن لاحقا أريد إعادة تهيئة myarray للإشارة إلى مجموعة مختلفة من السلاسل
self.myArray = [myOtherString componentsSeparatedByString:@","];
هل هو ممكن؟ شكرًا...
المحلول
نعم يمكنك إعادة تهيئة nsarray. هنا هو نموذج التعليمات البرمجية الذي استخدمته لإعادة تهيئة NSArray.
NSString *keywords = @"FirstName|LastName|Address|PhoneNumber";
NSArray *arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"First Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
[arr objectAtIndex:2],[arr objectAtIndex:3]);
arr = nil;
keywords = @"First_Name|Last_Name|_Address|_PhoneNumber";
arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"Second Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
[arr objectAtIndex:2],[arr objectAtIndex:3]);
نصائح أخرى
ذلك حقا يعتمد على ما تعنيه إعادة تهيئة. وبعد يمكنك تعيين اخر كائن ثابت إلى مؤشر، لأن المؤشرات ليست ثابتة.
مثال:
@interface MyObj : NSObject {
NSString *name; // not needed in 64bit runtime AFAIK
}
@property(retain) NSString *name; // sane people use copy instead of retain
// whenever possible. Using retain can
// lead to some hard to find errors.
@end
/* ... another file ... */
MyObj *theObject = [[[MyObj alloc] init] autorelease];
theObject.name = @"Peter";
NSString *oldName = theObject.name;
NSLog(@"%@", theObject.name); // -> Peter
NSLog(@"%@", oldName); // -> Peter
theObject.name = @"Martin";
NSLog(@"%@", theObject.name) // -> Martin
NSLog(@"%@", oldName) // -> Peter
إذا كان السلوك أعلاه هو ما تريد، فلا بأس بذلك.
إذا كنت تريد هذا السطر الأخير للعودة مارتن أنت في ورطة. تلك هي سلاسل ثابتة ليس يعني أن يتم تعديلها. يمكنك، إذا كنت تريد حقا، تعديل ذاكرة الكائن مباشرة، ولكن هذا أمر خطير وغير مستحسن. استخدم أشياء قابلة للتغيير إذا كنت بحاجة إلى هذا السلوك.
بالطبع يمكنهم. قائلا أن NSArray
غير قادر لا يعني أن سمة لفئة من هذا النوع لا يمكن تغييرها. لا يمكنك تغيير المحتوى، ولكن يمكنك تعيين محتوى جديد عليه.
إذا كنت ترغب في إجراء تغيير المرجع المستحيل، يجب عليك استخدامه const
الكلمة الرئيسية.