سؤال

أحاول الحصول على دورة iPhone من جامعة ستانفورد على iTunes U وأنا في حيرة من أمري بشأن المؤشرات.في المهمة الأولى، حاولت القيام بشيء من هذا القبيل

NSString *processName = [[NSProcessInfo processInfo] processName];
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

مما أدى إلى حدوث خطأ، وبعد إجراء تعديلات عمياء، اكتشفت أن العلامة * الموجودة في سطر NSInteger هي التي تسببت في المشكلة.

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

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

على افتراض أنني على حق، ما يحيرني هو لماذا لا أحتاج إلى القيام بذلك من أجل NSInteger؟

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

المحلول

NSInteger هو نوع بدائي، وهو ما يعني ذلك يمكن تخزينها محليا على المكدس.لا تحتاج إلى استخدام مؤشر للوصول إليه، ولكن يمكنك ذلك إذا أردت ذلك.الخط:

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

تقوم بإرجاع متغير فعلي، وليس عنوانه.لإصلاح هذا، تحتاج إلى إزالة *:

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

يمكنك الحصول على مؤشر إلى NSInteger إذا كنت تريد حقا واحدة:

NSInteger *pointerToProcessID = &processID;

علامة العطف هي عنوان المشغل.يقوم بتعيين المؤشر إلى NSInteger يساوي عنوان المتغير في الذاكرة، وليس العدد الصحيح في المتغير.

نصائح أخرى

والسبب أنك لا تعلن NSInteger مع * لأنه ليس كائن. وNSInteger هو مجرد int أو long:

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif

إذا كان يتم استخدامه في تطبيقات 32-بت، فإنه من عدد صحيح 32 بت، واذا كان يجري بناؤها في تطبيق 64 بت، انها صحيح 64-بت.

وبطبيعة الحال، كنت <م> يمكن تمرير NSInteger كمؤشر، ولكن معظم وظائف ببساطة أن تأخذ حججا باعتبارها NSInteger وليس مؤشر على ذلك.

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

وو* يعني "المؤشر". متغير الكائن يحمل مؤشر إلى كائن، لذلك لديه *. المتغير NSInteger يحمل NSInteger، لا مؤشر إلى NSInteger، لذلك لم يكن لديك *. وضع * على هذا المتغير يعطيك تحذيرا على الأقل لأنك وضع عدد صحيح إلى متغير المؤشر.

وNSInteger هو مجرد typedef ولكثافة العمليات، AFAIK.

العمل مع مؤشرات

NSInteger integer1 = 1;
NSLog(@"1. integer1:%ld &integer1:%p", integer1, &integer1);
//1. integer1:1 &integer1:0x7ffee59e8a98

NSInteger *integer2 = &integer1;
NSLog(@"2. integer2:%p &integer2:%p *integer2:%ld", integer2, &integer2, *integer2);
//2. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:1

*integer2 = 2;
NSLog(@"3. integer2:%p &integer2:%p *integer2:%ld \t integer1:%ld &integer1:%p", integer2, &integer2, *integer2, integer1, &integer1);
//3. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:2    integer1:2 &integer1:0x7ffee59e8a98
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top