سؤال

أنا جديد على الهدف - ج والكاكاو. لقد قرأت أن NSINTEGER و NSNumber يفضل عند العمل مع أعداد صحيحة بسيطة لأن إصدارات "آمنة من النظام الأساسي" من الأنواع الرقمية البدائية (وفي حالة NSNumber، ملفوفة في كائن). لذلك، أحتاج إلى عداد في صفي يتم تزويده عند حرائق NSTIMER. في منتدى Apple، وجدت مجموعة من الأشخاص الذين يوصون جميع الأشخاص بشخص ما في موقف مماثل يجب أن يعلن مؤشر NSNumber في الرأس، وتهيئة ذلك مع NumberWithint:، ثم في كل مرة يحتاج إليها، يمكنك زيادة ذلك من خلال تعيين ذلك كائن جديد (شيء مثل counter = [NSNumber numberWithInt:[counter intValue]+1];). هذا يبدو وكأنه مبالغة لي. إذا كان كل ما أحتاج إليه هو عداد Int (و BTW، فأنا أعيد ضبطه مرة أخرى إلى 0 بعد مرور 15، فلا شيء ليس مشكلة)، ولا يمكنني الابتعاد عن استخدام INT وليس لديك لتخصيص كائن جديد مع كل تكرار لحلقة الموقت الخاصة بي؟

وإذا كان الأمر كذلك، كيف يمكنني إجراء نوع بدائي متاح طوال فصلي. أعلم أنه مع أنواع الكائنات، أعلن أنه في واجهتي واستخدامproperty و synthethesize ... ما هو ما يعادل (إذا كان أحد) عند العمل مع البدائية؟

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

المحلول

باستخدام NSNumber للحصول على عداد بسيط لا يبدو قليلا من القتل. يمكنك إعلان أعضاء الفصل ك Nsinteger وتحديثها ببساطة باستخدام ++ أو + =

علي سبيل المثال:

@interface YourViewController : UIViewController  {
NSInteger counter;      
}

@property (nonatomic,assign) NSInteger counter;

TheSynthesize هو فقط:

@synthesize counter

ويمكن زيادة إما عن طريق:

self.counter += 1;

أو

counter ++;

في وقت لاحق سيمنع أي مراقبين من إبلاغهم، وبالتالي قد لا يكونوا أفضل.

نصائح أخرى

NSNumber هو تمثيل كائن رقم. يمكنني استخدامها عند تخزين الأرقام في فئة مجموعة لأنها يمكن أن تعقد فقط مؤشرات كائنات.

لذلك في مثالك، والتي تحتاج إلى عداد، ربما تكون مبالغة.

nsinteger هو مجرد عدد صحيح يتم تطبيقه ليكون آمنا لبرامج 32 و 64 بت، ويوصى به بواسطة Apple للاستخدام بدلا من int. وبعد ليس كائن. ربما هذا هو ما تحتاجه لمكافحة (nsuinteger في الواقع، وهو unsigned int) قد يكون أفضل.

أما بالنسبة لصنع البدائيات المتاحة طوال الفصل الخاص بك - حسنا، إذا كنت تعلن عنها في الرأس كإيفار، فهو متاح طوال فصلك على أي حال. @property و @synthesize هي مجرد موضوعية-ج 2.0 طرق لإعلان هذه الخصائص التي يمكن رؤيتها (وربما تم تغييرها) خارج صفك بطريقة متوافقة مع KVC / KVO. يمكن استخدام أنواع البدائية كخصائص باستخدام نفسه @property و @synthesize بناء الجملة.

أنا أستعمل NSInteger (ليس int، أن تكون أكثر محمولة)، ولفها إلى NSNumber إذا كنت بحاجة إلى إضافته إلى مجموعة (مثل NSMutableDictionary عند حفظ الحالة في ترك التطبيق).

وأنا أتفق مع غريزة الخاص بك، باستخدام كائن للحصول على أصوات عداد بسيطة مثل Overkill وسوف أضيف عدد غير ضروري من مكالمات إرسال الرسائل للحصول على عداد إضافي. لمكافحة لا تحتاج إلى تخزينها في مجموعة أو معالجة ككائن، تلتصق مع أنواع C Scalar C.

لإعلان العددية كمتغير مثيل من صفك، فقط أعلن ذلك في ملف رأسك:

@interface MyClass: NSObject{
  int counter;
}

@end

اذا أنت فعل تحتاج إلى زيادة عدد NSNumber (مثل خاصية NSManagedObject) وجدت هذه الفئة ساعدت:

@interface NSNumber (Incrementer)
- (NSNumber *)increment;
@end

@implementation NSNumber (Incrementer)
- (NSNumber *)increment {
    return [NSNumber numberWithInt:[self intValue]+1];
}
@end

حتى تتمكن من تبسيط البيانات الزيادة إلى:

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