كيف يمكنني تخزين سلسلة كصفيف في قائمة خاصية الكاكاو؟

StackOverflow https://stackoverflow.com/questions/972605

سؤال

أحاول إنقاذ سلاسلين. تحتاج سلسلة واحدة إلى حفظها كصفيف نوع في المعطر ويجب حفظ السلسلة الثانية كسلسلة في الصفيف.

يمكنني استخدام الرمز:

SetObject: (ID) anobject forkey: (ID) AKEY>

لكنه لا ينقذه بشكل صحيح. يمكنني إلقاء إحدى السلاسل كصفيف، لكنها لا تزال لا تعمل بشكل صحيح.

ما هي الطريقة الصحيحة لإنقاذ صفيف إلى المعطر؟

هنا هو ما تبدو بلدي معي:

<dict>
<key>Test One</key>
<array>
    <string>A13#</string>
</array>
<key>Another Test</key>
<array>
    <string>1111111111</string>
</array>
<key>Test Three</key>
<array>
    <string>2222222222</string>
</array>
<key>Final Test</key>
<array>
    <string>3333333333</string>
</array>
</dict>

هنا الطريقة التي أستخدمها لمحاولة

-(void)writeToFile:(NSString *)s1{
    NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"saved" ofType:@"plist"];

NSMutableDictionary *dictionary = [[[NSDictionary alloc] initWithContentsOfFile:plistPath] mutableCopy];
NSString *tempString = [NSString stringWithFormat:@"1234567"];
[dictionary setObject:tempString forKey:s1];

[dictionary writeToFile:plistPath atomically:YES];
}
هل كانت مفيدة؟

المحلول

لا يمكنك إلقاء أو تحويل سلسلة إلى صفيف؛ إنها أشياء منفصلة ومميزة. إنه نفسه كما لو كنت في الحياة الحقيقية، تحاول تحويل كلبك إلى عربة محطة، فلا يحدث ذلك.

بدلا من ذلك، ضع كلبك داخل عربة المحطة (أو ضع السلسلة (السلسلة) داخل صفيف). يمكنك إنشاء مجموعة مع [NSArray arrayWithObjects:@"string1", @"string2", nil];. وبعد عصا ذلك داخل قاموسك للحصول على مفتاح معين، إلى جانب السلسلة النهائية الخاصة بك لمفتاح آخر، وحفظه، وستحصل على مجموعة مع مجموعة من سلاسل واحدة أو أكثر.

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

نصائح أخرى

أنت تحويل سلسلة إلى صفيف عنصر واحد مع

[NSArray arrayWithObject:str];

لذلك إذا كنت تريد أن تحتوي على مستوياتك تحتوي على إدخالات كصفوفات من السلاسل، وتريد فقط سلسلة واحدة كعنصر، فستفعل شيئا مثل:

[dictionary setObject:[NSArray arrayWithObject:tempString] forKey:s1];

أنا لا فعلا لماذا تريد ذلك بهذه الطريقة ما لم ترغب في السماح بأسلوت متعددة لكل مفتاح في وقت آخر.

أيضا، كما ذكر مارك، تقوم بتسريب decretary الأولي (غير القابل للاستمرار) الذي تنشئه. قراءة قواعد إدارة الذاكرة في http://developer.apple.com/documentation/cocoa/conectual/memorymgmt/articles/mmrules.html..

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

وأخيرا، إذا كانت هذه تهدف إلى أن تكون تفضيلات المستخدم للفرسة، فيجب عليك استخدام نظام التفضيلات، والذي يسمح بتكوين الإعدادات الافتراضية ويخزن التفضيلات في مجلد التفضيلات لك. يرى http://developer.apple.com/documentation/cocoa/coneptual/userdefaults/userdefaults.html. للمزيد من المعلومات.

الطريقة الصحيحة لإنقاذ nsarray. (بحد ذاته) إلى ملف متقطع هو كما يلي:

NSArray* anArray = ...;
[anArray writeToFile:@"/path/to/file.plist" atomically:YES];

ومع ذلك، لا يمكنك حفظ nsstring كصفيف. بالنظر إلى شاشة XML التي قدمتها، إذا كنت ترغب في إضافة إدخالات بنفس التنسيق، فيمكنك استخدام هذا الرمز الأكثر بساطة:

- (void) writeToFile:(NSString *)string {
  NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"saved" ofType:@"plist"];
  NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
  [dictionary setObject:[NSArray arrayWithObject:@"1234567"] forKey:string];
  [dictionary writeToFile:plistPath atomically:YES];
}

هذا يتجنب أيضا تسرب الذاكرة في التعليمات البرمجية الخاصة بك، حيث جهاز الاستقبال -mutableCopy يهرب مع عدد الاحتياجات من 1. (هذه ليست مشكلة ضمن GC، لكنها لا تزال ممارسة سيئة.) يجب ألا تحتاجها للاستخدام +[NSString stringWithFormat:], ، ما عليك سوى استخدام سلسلة حرفية. إذا كنت ترغب في استخدام الاختلاف كسلسلة في الصفيف، فيمكنك إما تمريرها كمعلمة إضافية، أو الاستيلاء عليها من طريقة أخرى، إلخ.

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

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