سؤال

اعتقدت أن المتغير في object-c هو مجرد إشارة إلى كائن في مكان ما في الذاكرة.لذا، حسب فهمي، يجب أن تكون النتيجة "واحد"، لأنه في النهاية قمت بتعيين عنوان ذاكرة الكائن من str1 إلى str2، وفي السابق قمت بتعيين عنوان ذاكرة str2 للاختبار.

NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];

test = str2; // test is an instance variable. I use no getter/setter here! just for testing!
str2 = str1;
NSLog(test); // = "two" ??
هل كانت مفيدة؟

المحلول

وهذه هي الطريقة التي عمل المؤشرات. والنتيجة أن ترى طبيعية وصحيحة.

ودعونا سرد كافة المتغيرات وما السلاسل يشيرون إليها في الذاكرة ويتم الإعلان عنها:

str1 -> "One"
str2 -> "Two"

وبعد ذلك، يمكنك تنفيذ بعض التعليمات المهمة:

test = str2;

وهذا يعين قيمة str2 المؤشر إلى test. وبالتالي فإن المؤشرات هي

str1 -> "One"
str2 -> "Two"
test -> "Two"

ثم

str2 = str1;

ويعين قيمة str1 المؤشر إلى str2. الآن مؤشرات هي

str1 -> "One"
str2 -> "One"
test -> "Two"

وبعد ذلك يمكنك طباعة test، الذي يشير إلى ما str2 كان يشير إلى الأصل، وهو "اثنان".

وأعتقد أنك تعتقد أنه منذ قمت بتعيينه str2 لقيمة str1، وtest لقيمة str2، أن قيمة str1 بطريقة أو بأخرى أجهزة الطرد المركزي في test. ليست هذه هي القضية. مرة واحدة يتم تعيين قيمة test، ويتم فقدان المعلومات بشأن أين جاءت هذه القيمة من بينها. إذا كنت تريد القيمة test لتكون هي نفسها كما في str1، لديك أنت عكس ترتيب عمليات مهمتك:

str2 = str1;
test = str2;

نصائح أخرى

لديك هذا:

test = str2; // test is an instance variable.testing!
str2 = str1;
NSLog(test); // = "two" ??

والآن، دعونا ندعي أن كل هذه المتغيرات [إينتس].

في السطر الأول، يتم تعيين test المتغير إلى قيمة str2 متغير. في السطر الثاني، يتم تعيين str2 المتغير إلى قيمة str1 متغير. في السطر الثالث، ونحن بطباعة قيمة test، وانها في الواقع قيمة هو أن str2 عندما كنا تعيين str2 لاختبار. هل حقا لا يهم في كل ما نقوم تعيينه في وقت لاحق str2 قيمة مختلفة.

وطيب، ولكن المتغيرات هي في الواقع مؤشرات، أقول لكم، لا [إينتس].

وبغض النظر: التفكير في مؤشر على أنها مجرد رقم، عنوان في مكان ما في الذاكرة. ويمر ذلك إلى NSLog يجعل NSLog الطباعة لا قيمة المؤشر، ولكن قيمة ما نقاط المؤشر إلى، وهي مجموعة من شار.

المتغير عبارة عن حاوية.فالمهمة تأخذ ما في الجانب الأيمن وتضعه أيضًا في ما في الجانب الأيسر.بمعنى آخر، يقوم بنسخ القيمة من متغير إلى آخر؛وفي هذه الحالة، تكون هذه القيم مؤشرات (عناوين الذاكرة).

إذن إليك ما فعلته:

  1. خذ العنوان الموجود في str2 متغير ووضع نفس العنوان في test عامل.
  2. خذ العنوان الموجود في str1 متغير ووضع نفس العنوان في str2 عامل.

الخطوة 2 لا تؤثر على test عامل؛كانت مهمتك الوحيدة لهذا المتغير في الخطوة 1.

مهم:أنت لا تنسخ ما هو في العنوان؛أنت تنسخ العنوان نفسه.لا يزال هناك سلسلة "اثنين" واحدة فقط، ولكن بين الخطوتين 1 و2، العنوان من هذا الكائن في كليهما str2 و test.ثم، في الخطوة 2، يمكنك استبدال العنوان الموجود str2 بعنوان السلسلة "الواحدة" الموجودة أيضًا في str1, ، مغادرة test باعتباره المتغير الوحيد الذي لا يزال يحمل عنوان السلسلة "اثنين".

بالمناسبة، stringWithCString: تم إهماله.يستخدم stringWithUTF8String: أو stringWithCString:encoding: بدلاً من.

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