لماذا تتصرف المتغيرات بشكل غريب؟
-
03-07-2019 - |
سؤال
اعتقدت أن المتغير في 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 الطباعة لا قيمة المؤشر، ولكن قيمة ما نقاط المؤشر إلى، وهي مجموعة من شار.
المتغير عبارة عن حاوية.فالمهمة تأخذ ما في الجانب الأيمن وتضعه أيضًا في ما في الجانب الأيسر.بمعنى آخر، يقوم بنسخ القيمة من متغير إلى آخر؛وفي هذه الحالة، تكون هذه القيم مؤشرات (عناوين الذاكرة).
إذن إليك ما فعلته:
- خذ العنوان الموجود في
str2
متغير ووضع نفس العنوان فيtest
عامل. - خذ العنوان الموجود في
str1
متغير ووضع نفس العنوان فيstr2
عامل.
الخطوة 2 لا تؤثر على test
عامل؛كانت مهمتك الوحيدة لهذا المتغير في الخطوة 1.
مهم:أنت لا تنسخ ما هو في العنوان؛أنت تنسخ العنوان نفسه.لا يزال هناك سلسلة "اثنين" واحدة فقط، ولكن بين الخطوتين 1 و2، العنوان من هذا الكائن في كليهما str2
و test
.ثم، في الخطوة 2، يمكنك استبدال العنوان الموجود str2
بعنوان السلسلة "الواحدة" الموجودة أيضًا في str1
, ، مغادرة test
باعتباره المتغير الوحيد الذي لا يزال يحمل عنوان السلسلة "اثنين".
بالمناسبة، stringWithCString:
تم إهماله.يستخدم stringWithUTF8String:
أو stringWithCString:encoding:
بدلاً من.