كيف يمكنني تعيين قيمة غير مالية في الهدف ج؟

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

  •  06-09-2019
  •  | 
  •  

سؤال

قد يكون هذا السؤال خارج القاعدة، ولكن هذه المشكلة التي أواجهها:

أحاول تشغيل مثال من iPhone SDK، وأنا أهرب إلى انتهاك وصول. لقد تتبعت بعض السلوك الذي أعتقد أنه مشبوه.

إليك ما يشبه الفصل:

@interface TableViewCell : UITableViewCell {

@private    
    UILabel *_earthquakeLocationLabel;
    UILabel *_earthquakeDateLabel;
    UILabel *_earthquakeMagnitudeLabel;
    UIImageView *_magnitudeImageView;
}

عندما أقوم بتعيين نقطة توقف في

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier

وننظر إلى "الذات" في المصحح، فهو يدل على أنه _earthakeatelabel هو "0x12"، _earthqueMagnitudelabel هو 0x1000، والآخرين هم الصفر. إذا حاولت تعيين لأي من تلك غير الصفيعة، أحصل على انتهاك وصول.

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

لذلك سؤالي هو، هل هناك أي شيء خاص حول تهيئة هذه القيم التي يجب أن أفعلها؟ أو بأي طريقة لتعيين القيمة عندما يكون لها قيمة وهمية فيه؟


بعض المعلومات الإضافية:

لذلك إذا قمت بتعيين Nil إلى _earthquakateatelabel و _earthqueMagnitudelabel في التهيئة، التي تعمل على إصلاح المشكلة. لكنني لا أفهم لماذا يتم إنشاء الكائن بقيم في تلك الحقول؛ أتوقع أن يكونوا لا شيء. يتم إنشاء الكائن على كومة:

TableViewCell *cell = [[[TableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];

لا يوجد حل صحيح

نصائح أخرى

يبدو وكأنه self المؤشر هو وهمية. القيم 0x12 و 0x1000 هي الثوابت الصحيحة؛ إنها بالتأكيد ليست مؤشرات لعناوين الذاكرة الصحيحة. إن حقيقة أنك تشير هذه القيم تشير إلى أن هناك شيئا خاطئا، ومحاولة التلاعب بها بأي شكل من الأشكال (القراءة أو كتابتها) ستؤدي إلى الأخطاء. في هذه الحالة، يمكنك الحصول على انتهاك وصول لأنك تحاول الكتابة إلى عناوين الذاكرة 0x12 و 0x1000، وهي عناوين غير صالحة.

كيف حالك خلق TableViewCell أشياء؟ انت تفعل TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]ب هذه هي الطريقة الصحيحة.

الآن سأحصل على مصححي النفسي الخاص بي: خمن هو أنك تنسى أن تعلن TableViewCell كائن مع مؤشر، أي أنك تعلن أنه TableViewCell myCell بدلا من TableViewCell *myCell (لاحظ وجود النجمة). سيؤدي ذلك إلى إنشاء الكائن الموجود على المكدس بدلا من كومة الكومة، ونتيجة لذلك، سيكون له القمامة في أعضاء البيانات الخاصة به، بدلا من الأصفار. كائنات الهدف C، عند تخصيصها بشكل صحيح، سيكون لها جميع أعضاء البيانات الخاصة بهم تهيئة إلى 0 (أو NULL, nil أو false, ، اعتمادا على نوع البيانات) بعد مكالمة ناجحة alloc.

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