سؤال

والنظر في هذا رمز زائف:

// an image is initialized
UIImage *imagePX = [[UIImage alloc]initWithContentsOfFile:... bla bla

imagePX = [self rotateImage:imagePX]; //A
[self doStuff:imagePX]; //B

وبعد ذلك لدي طريقة rotateImage:

- (UIImage*) rotateImage:(UIImage*)source {
  ... rotate the image... draw on context...
  [source drawInRect... bla bla
  ...

  UIImage *rotatedImage =  UIGraphicsGetImageFromCurrentImageContext();

  return rotatedImage;
}

وسؤالي هو: صدر imagePX أبدا. كما يتم تمرير الصورة إلى طريقة RotateImage، أعتقد أنه كان يمكن ببساطة الإفراج عنها، بعد استخدامه على الأمر [المصدر drawInRect ...]، وسوف أعود لrotatedImage على طريقة، ولكن إذا فعلت ذلك، فإن البرنامج سوف تعطل، لأنه يجب أن توجد في imagePX متغير بحيث خط يمكن تقييم.

ومشكلتي الأخرى هي أن الصورة سوف ترسل على B إلى روتين آخر. لذلك، ما هي أفضل طريقة لجعله يعمل دون أن تفقد مسار imagePX وتسرب؟

ما هو أفضل نهج؟

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

المحلول

وبدلا من

[[UIImage alloc]initWithContentsOfFile:... bla bla

استخدم

[UIImage imageWithContentsOfFile:...bla bla

وسيتم autoreleased هذا الأخير.

نصائح أخرى

وليس هناك حاجة لتخصيص مثيل UIImage. imageWithContentsOfFile هو أسلوب ثابت، ويمكن أن يطلق على الطبقة نفسها.

ومنذ imageWithContentsOfFile لا تشمل شروط alloc، new، أو copy الكائن عاد (من الاتفاقية) لا يتم الاحتفاظ، وسيتم autoreleased في استنزاف الأول من تجمع autorelease.

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

وماذا عن [UIImage imageNamed: @ ""]؟ لا الوك، لا حاجة لاطلاق سراح)

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