سؤال

قرأت أن أنواع البيانات غير القابلة للتغيير لا يمكن تعديلها ذات مرة. (مثل 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 الكلمة الرئيسية.

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