سؤال

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

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

المحلول

يرجى الاطلاع على وثائق الطريقة التالية:

- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength

تقول أبل بوضوح ما يلي:

إذا كان طول النطاق لا يساوي استبدال الطول ، فسيتم تغيير حجم المتلقي لاستيعاب البايتات الجديدة. يتم تحويل أي نطاق بايت الماضي في المتلقي لاستيعاب البايتات الجديدة. لذلك يمكنك تمرير Null for reprameBytes و 0 لاستبدال الطول لحذف البايتات في جهاز الاستقبال في نطاق النطاق. يمكنك أيضًا استبدال نطاق (والذي قد يكون طوله صفريًا) ببايت أكثر من طول النطاق ، والذي له تأثير الإدراج (أو "استبدال البعض وإدراج المزيد").

لإزالة 10 بايت من النهاية ، استخدم:

[data setLength:[data length] - 10];

يمكن أيضًا القيام به عن طريق ReplyBytesInRange ، ولكنه في الواقع أسرع بكثير ، لأن البايتات لم تتم إزالتها حقًا. بدلاً من ذلك ، يتم تغيير متغير الحجم الداخلي فقط وسيتصرف NSMutabledata كما لو تم إزالة البايتات. IOW ، هذه عملية O (1) (وهذا يعني أن الأمر سيستغرق دائمًا وقتًا طويلاً لأداء ، بغض النظر عن عدد البايتات التي تزيلها) ، وهي سريعة جدًا.

لإزالة 10 بايت من المقدمة ، استخدم:

[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];

لإزالة 10 بايت في الوسط (على سبيل المثال بعد 20 بايت) ، استخدم:

[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];

REPLISTBYTESINRANGE هي عملية o (n) ، على الرغم من. هذا يعني أنه بغض النظر عن المدة التي يستغرقها إزالة 100 بايت ، سيستغرق الأمر ضعف الوقت لإزالة 200 بايت وما إلى ذلك. لا يزال سريعًا جدًا ولا يقتصر إلا على إنتاجية ذاكرة جهاز الكمبيوتر الخاص بك (RAM). إذا كان لديك 10 ميغابايت من البيانات وقمت بإزالة 1 ميغابايت من الأمام ، يتم نسخ 9 ميغابايت لملء الفجوة في MB التي تمت إزالتها للتو. وبالتالي فإن سرعة العملية تعتمد على مدى سرعة انتقال نظامك 9 ميغابايت من ذاكرة الوصول العشوائي من عنوان إلى آخر. وهذا عادة ما يكون سريعًا بما فيه الكفاية ، إلا إذا تعاملت مع كائنات NSMutabledata التي تحتوي على مئات MB.

نصائح أخرى

يجب أن يكون هناك ميزة مستقبل الحدث الذي سيقوم بإضافة نوع المحتوى برمجيا إلى المكتبة، يرجى إلقاء نظرة إذا كان هناك أي

إذا كانت البيانات التي تريد إزالتها في النهاية ، يمكنك استخدامها

[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];

أو مع بناء جملة OBJ-C 2.0

NSMutableDataInstance.length -= n;

لأي شيء أكثر تعقيدًا مما أوصي به معالجة البيانات الأولية.

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

[myData setData:[NSData dataWithBytes:NULL length:0]];

هذا يعمل بشكل رائع.

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