هل nsnumber overkill لمكافحة مستوى المثيل؟
-
06-09-2019 - |
سؤال
أنا جديد على الهدف - ج والكاكاو. لقد قرأت أن 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];