سؤال

عندما حاولت تجميع بلدي التطبيق لنظام التشغيل 3 لقد واجهت الخطأ التالي:

خطأ:نوع من أسلوب استرجاع القيمة لا تتناسب مع نوع من الملكية

الخطأ كان لخاصية حاولت الوصول التي يتم تعريفها على النحو التالي:

NSMutableArray *myArray

@property (readonly,nonatomic) NSArray* myArray;

يقع مكان الإقامة @تصنيعه في تنفيذ الملف.

هذا عملت على ما يرام في OS 2.2.1 ولكن لا OS 3.0

كتابة طريقة حاصل نفسي تحل المشكلة.

هو أي شخص على بينة من التغييرات على الهدف-c بين OS 2.2.1 و 3.0?هل هناك أي وثائق هذه التغييرات ؟

على التغييرات API الوثيقة لا يبدو أن تحتوي على أي شيء حول هذه المسألة.

تحرير

يحدث الخطأ عند محاولة الوصول إلى مكان الإقامة مثلا ،

NSArray *anArray = myClass.myArray;

كما ذكرت أعلاه وجدت حلا لهذه:كتابة طريقة حاصل نفسي ، ولكن ما أنا حقا بعد هو نوع من الوثائق من أبل شرح هذا التغيير وغيرها من التغييرات التي لم يتم API ذات الصلة.

شكرا على مساعدتك

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

المحلول

وهذا هو علة مترجم.

وعلى الرغم من أنك لم يحدد تماما، وأتوقع التعليمات البرمجية يبدو مثل هذا:

@interface Foo : NSObject {
    NSMutableArray *objects;
}
@property (readonly, copy) NSArray *objects;
@end

@implementation Foo
@synthesize objects;
@end

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

ويمكنك حل هذا عن طريق تغيير التعليمات البرمجية لفصل واضح في تعريف متغير مثيل من تعريف الممتلكات، وعلى سبيل المثال من خلال التقديم اسم متغير سبيل المثال:

@interface Foo : NSObject {
    NSMutableArray *_objects;
}
@property (readonly, copy) NSArray *objects;
@end

@implementation Foo
@synthesize objects = _objects;
@end

وبهذه الطريقة المترجم لا يحصل الخلط حول الخاصية مقابل متغير مثيل في تعابير مثل self.objects (التي لا ينبغي على أي حال، ولكن على ما يبدو لا).

وفقط لدرء الإجابة الحتمية: أبل <م> لا حجز البادئة underbar للمتغيرات المثال. محجوز لمدة الأساليب. بغض النظر، إذا كنت لا يروق underbar، لا تتردد في استخدام بادئة آخر.

نصائح أخرى

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


علما أنه حتى لو كنت تعلن نوع العقار أن يكون NSArray, الكائن عاد لا يزال NSMutableArray, و قابلة للتغيير طرق هي المحدد لها.إعلان الملكية في هذا الطريق لا لا منع أي شخص من غير قصد تحور مجموعة.

إذا كنت تريد أن تكون على يقين من أن عادت مجموعة غير قابلة للتغيير ، يمكن تعريف الخاصية كما في الأمثلة الأصلية ، ومن ثم لفة الخاص بك accessor:

- (NSArray *)myArray { return [NSArray arrayWithArray:myArray]; }

علما أن هذا من شأنه أن يعود unretained NSArray.يكون المتصل أن تأخذ ملكية الكائن إذا كان هناك حاجة مستمرة.

وأنت ترى الأخطاء لكسكودي وتصدر الآن التحذيرات والأخطاء لأشياء لم يفعل ذلك من قبل ...

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

وانها لا تزال الهدف-C 2.0؛ المترجم هو فقط ربما قليلا مع تحديث النظر في هذا النوع من نوع تغيير خطأ. انها الى حد كبير يجب أن يكون خطأ. على الأقل يجب أن يحذرك أنك على الأرجح لا يعني ما كتبته. ثم هل يمكن أن يلقي الأشياء لجعلها لا يحذرك، والتي لا يمكن القيام به مع بيان @synthesize.

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

على تحديث : في أوه أرى أن الواقع محاولة لضبط العقار حيث تحصل على الخطأ الذي ذكرته

    self.myArray = [NSArray arrayWithObject:@"foo"];

من الواضح أنك لا يمكن أن @synthesize هذا السلوك ويجب أن يكتب من يمكنهم الدخول الخاصة بك.

- (NSArray*)myArray {
    return [NSArray arrayWithArray:myArray];
}
- (void)setMyArray:(NSArray*) pMyArray {
    myArray = [NSMutableArray arrayWithArray:pMyArray];
}

وتعبئة في هذه accessors، لم يجعل رسالة تزول، لذلك اضطررت لتغيير الوصول إلى:

    [self setMyArray:[NSArray arrayWithObject:@"foo"]];

وباستخدام بناء الجملة أعلاه دون يمكنهم الدخول مخصصة أيضا لم تنجح.

وPS نجاح باهر، هو أي شخص آخر بالضيق التي يمكنك نسخ لا فقاعات الرسالة، أو النص في إطار النتائج بناء؟

وهكذا هذا هو حقا القيام به مع الدعوةsynthesize التي ليست سعيدة حول تعريض NSMutableArray باعتبارها NSArray - لماذا لا مجرد تنفيذ getMethod

والتفكير في الواقع عن ذلك يجب أن يكون أسلوب مجموعة التي ليست سعيدة - فإنك لن تكون قادرا على تعيين وNSArray إلى NSMutableArray

وكانت أسئلتك:

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

هل أي شخص على علم تغييرات موضوعية ج بين OS 2.2.1 و 3.0؟

     

هل هناك أي وثائق لهذه التغييرات؟

والأجوبة النهائية هي:

1) لم تكن هناك تغييرات متعمدة لمواصفات اللغة، ولكن تغير مترجم وأدوات المطورين الأخرى. كريس وزملائه في العمل هم خبراء في هذه التغييرات.

2) ربما لا، لأن أي تغييرات كانت غير مقصودة أو التي أدخلت على السلوك مباراة أفضل مع الوثائق.

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

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