سؤال

أحتاج إلى إعلان خاصية لمجموعة C من نوع الهيكل المخصص.

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

حاولت memset()جي الذاكرة في المصفوفة ، وفشل فشلاً ذريعًا مع خطأ في الترجمة. هل يمكن لأحد أن يشرح ذلك أيضًا؟

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

المحلول

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

في C لا يمكنك إرجاع أنواع الصفيف من الوظائف. هذا مجرد قيود على اللغة (عن قصد أو غير مقصود لا أعرف). بالامتداد ، في الهدف-C لا يمكنك إرجاع أنواع الصفيف من الطرق. هذا يعني أيضًا أنه لا يمكنك استخدام أنواع الصفيف كخصائص ، لأن المترجم غير قادر على ذلك synthesize طريقة تُرجع نوع الصفيف.

يتم تحويل المصفوفات C تلقائيًا إلى أنواع مؤشرات عند استخدامها في تعبير ، بحيث يمكنك اتباع نصيحة @Graham واستخدام المؤشرات بدلاً من ذلك. الجانب السلبي لهذا النهج هو أنه يجب أن تعرف بالضبط عدد العناصر الموجودة في الصفيف حتى لا تقرأ عن طريق الخطأ في نهاية تكنولوجيا المعلومات. إذا كان عدد العناصر ثابتًا ومعروفًا في وقت الترجمة ، فربما يكون هذا هو السبيل للذهاب (إذا كنت ترغب في تجنب NSArray لاي سبب كان).

من الصعب الإجابة على السببmemset فشل في التجميع دون أن ترى فعليًا كيف استخدمته ، ولكن بشكل عام ، هذا هو كيفية استخدامه:

MyStruct someStructs[10];

memset(someStructs, 0, sizeof someStructs);

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

نصائح أخرى

إذا كان لديك هذا:

@interface MyClass
{
    struct MyStruct foo[5];
}
@end

لا يمكنك الحصول على خاصية قراءة/كتابة على الإطلاق. يمكنك إعلان خاصية قراءة فقط

@property (readonly, assign) struct MyStruct* fooProperty;

مما سيعطيك مؤشرًا للمصفوفة. ومع ذلك ، ربما يكون هذا أمرًا سيئًا لأنه يمنح بقية الكود الداخلي وصولاً داخليًا إلى بنية MyClass. من الأفضل تنفيذ kvc مفهرسة الوصول, ، والتي يجب عليك القيام بها يدويًا.

من المؤكد أنك يمكنك التعامل مع المصفوفة كخاصية ، وسيكون لها سلوك "تعيين" لأنه لا يمكنك الاحتفاظ ببنية. في الأساس لا تزال مسؤولاً تمامًا عن تخصيص الذاكرة للمصفوفة.

خيار آخر لديك هو استبدال بنيتك بكائن. ثم يعمل بشكل طبيعي مع آلية العقار ، ويفتح فصول جمع الأساس مثل NSArray لك.

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