سؤال

ولقد العمل من أجل التنمية فون لفترة من الوقت. لأول مرة، وأنا مندهش جدا مع إدارة الذاكرة في الهدف-ج :). ولكن الآن حصلت عليه قليلا.

والسؤال هو، في وقت ما، وأنا استخدم بروتوكول كسمة من فئة، لأنني أعتقد تعريفه تشبه الى حد بعيد "واجهة" في C # أو جافا. مثل أدناه.

@protocol Shield
   ...
@end

// Interface
@interface Dragon {
    id<Shield> shield
    NSString * name;
}

@property (nonatomic,retain) id<Shield> shield;
@property (nonatomic,retain) NSString * name;

@end

ولكن أنا في كل حين الإفراج عن أي كائن السمة في طريقة dealloc (). مثل أدناه.

-(void)dealloc {
   [name release];
   [shield release];  // <--- Totally impossible. xcode said '-release not found in protocol'
   [super dealloc];
 }

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

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

المحلول

وتحتاج إلى تعريف البروتوكول الخاص على الالتزام بروتوكول NSObject، مثل هذا:

@protocol Shield <NSObject>
   ...
@end

وانها بسيطة عندما كنت تعرف كيف! ؛ -)

وتحرير: أيضا، كنت الصحيح - البروتوكولات في الهدف-C هي يعادل الواجهات في جاوة وC #

.

وتحرير آخر: قد ضرب لكم والغريب الحاجة إلى القيام بذلك، ولكن الهدف-C يسمح للكائنات جذور متعددة، لذلك لا يمكن أن تضمن في الواقع أن كل كائن سوف ينزل من NSObject. منذ release هو وسيلة NSObject، لديك لتحديد البروتوكول الخاص على الالتزام أيضا على بروتوكول <NSObject> قبل أن تتمكن من التأكد من أنها سوف تكون قادرة على الاستجابة لطريقة release.

نصائح أخرى

1-الشيء الصحيح للقيام بدلا من [الإفراج درع] هو وضع

self.shield = nil;

2-أيضا تغيير

@property (nonatomic,retain) id<Shield> shield; 

إلى

@property (nonatomic,assign) id<Shield> shield;

وبعد ذلك انت بخير.

وتحرير:

<اقتباس فقرة>   

والسبب أن تتجنب الاحتفاظ   المندوبين هي التي تحتاج إلى تجنب   الاحتفاظ حلقة:

     

وA B A يخلق تضع نفسها كما في B   مندوب ... وصدر من قبل مالكها

     

إذا B احتفظت A، A لن يكون   صدر، وB تمتلك A، وبالتالي A في   dealloc لن الحصول على استدعاء،   مما تسبب في كل من A و B للتسرب.

     

ويجب أن لا تقلق حول والذهاب بعيدا   ب / ج فإنه يملك B وبالتالي يتخلص منه   في dealloc.

لماذا الهدف عادة تعطى المندوبين -C على إسناد الملكية بدلا من الاحتفاظ بها؟

والرجاء انظر المرجع الطبقة uitableview لإعلان المثال بروتوكول:

وproperty (nonatomic، تعيين) معرف مندوب

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