iphone - يكتب - ما هو الاختيار الصحيح بين NSDecimal و NSDecimalNumber و CFNumber؟




ما معنى كلمة find بالعربي (2)

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

r = [obj performSelector:NSSelectorFromString(@"capitalizedAmount")];

لا تقوم KVC ببساطة بإرسال الرسائل إلى الكائنات باستخدام السلاسل النصية. راجع دليل برمجة ترميز مفتاح القيمة .

هل يجب علي الحصول على قيم تعويم من NSDecimalNumber ، ثم القيام بالعمليات الحسابية وإرجاع النتيجة ملفوفة في NSDecimalNumber؟

لا. التحويل إلى نقطة عائمة ثنائية ( float / double ) من الفاصلة العشرية العشرية ( NSDecimal / NSDecimalNumber) هي خسارة. ستكون النتيجة غير صحيحة لبعض الحسابات إذا قمت بها بهذه الطريقة.

لقد قرأت الكثير عن NSDecimal و NSNumber و NSNumberDecimal و CFNumber ... وتبدأ في أن تكون نوعًا من الأدغال بالنسبة لي.

في الأساس ، أحاول إنشاء فئة نموذج بسيطة تعالج عمليات حسابية بسيطة ، مثل هذه العملية:

#import <Foundation/Foundation.h>


@interface Test : NSObject
{
    float rate;
    float amount;
    int duration;
}

- (float)capitalizedAmount;

@end

@implementation Test

- (float)capitalizedAmount {
    return (amount*pow((1.0+rate),duration));
}

@end

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

// This is just the desired behavior
// This evidently won't work with the previous class definition
Test *obj = [[Test alloc] init];
[NSNumber numberWithInt:10]
...
float r;
r = [obj performSelector:NSSelectorFromString(@"capitalizedAmount")];

أنا أفهم أن هذا غير ممكن ، أن performSelector: سيُرجع كائنًا ، وبالتالي يجب أن performSelector: هذا performSelector: capitalizedAmount بإرجاع كائن. لقد قرأت أشياء عن NSInvocation والجزء ذو الصلة في NSInvocation Objective-C على comp.lang.

أفهم أيضًا أنني يجب استخدام NSDecimalNumber ، ولكن هناك شيئان أود NSDecimalNumber :

  1. هل الذاكرة الزائدة وفقدان الأداء مقبول بالنسبة لفئة أكثر تعقيدًا إلى حد ما (فقط الحسابات المالية من هذا النوع ، تظهر في UITableView)؟ ليس لدي خلفية كبيرة في C ...
  2. أليس من الصعب جدا ومعقدا لاستخدام وظائف مثل decimalNumberByAdding: مع بايثون كان من السهل تعريف __add__ لاستخدام المشغلين مع الكائنات. هل يجب علي الحصول على قيم تعويم من NSDecimalNumber ، ثم القيام NSDecimalNumber الحسابية وإرجاع النتيجة ملفوفة في NSDecimalNumber ؟ كيف تتعامل مع هذه المشكلة؟

أنا أبحث عن حل بسيط وجميل!

مجرد سؤال آخر في نفس المنطقة: هو CFBoolean المجمع الكائن لـ BOOL على iPhone Core Foundation؟

شكرا جزيلا لك على مساعدتك!


Ole صحيح ، في ذلك يجب أن تستخدم NSDecimal أو NSDecimalNumber لتجنب أخطاء حساب الفاصلة العائمة عند القيام بالحسابات المالية. ومع ذلك ، سيكون اقتراحي لاستخدام NSDecimal والدالات C الخاصة به بدلاً من NSDecimalNumber. يمكن أن تكون العمليات الحسابية NSDecimal أسرع بكثير ، وحيث أنها تتجنب إنشاء الكثير من الكائنات التي تم تجديدها تلقائيًا ، وهي أفضل بكثير من استخدام الذاكرة.

على سبيل المثال ، قمت بإجراء عمليات مقارنة للرياضيات بين هذين النوعين على جهاز MacBook Air الخاص بي:

NSDecimal

Additions per second: 3355476.75
Subtractions per second: 3866671.27
Multiplications per second: 3458770.51
Divisions per second: 276242.32

NSDecimalNumber

Additions per second: 676901.32
Subtractions per second: 671474.6
Multiplications per second: 720310.63
Divisions per second: 190249.33

كانت الأقسام هي العملية الوحيدة التي لم تشهد زيادة في الأداء بمقدار خمسة أضعاف تقريبًا عند استخدام NSDecimal مقابل NSDecimalNumber. تحدث تحسينات في الأداء مماثلة على iPhone. هذا ، إلى جانب توفير الذاكرة ، كان السبب في تحولنا مؤخرًا إلى استخدام Core Plot لاستخدام NSDecimal.

تتمثل الصعوبة الوحيدة التي تواجهها في الحصول على القيم داخل وخارج أنواع NSDecimal. قد يتطلب الانتقال مباشرة من وإلى قيم float و integre استخدام NSDecimalNumber كجسر. أيضًا ، إذا كنت تستخدم Core Data ، فسيتم تخزين قيمك كـ NSDecimalNumbers ، وليس NSDecimals.





key-value-coding