لماذا بلادي متغير مثيل تتصرف غريب جدا؟ هل حصلت عليه بشكل صحيح؟

StackOverflow https://stackoverflow.com/questions/803218

  •  03-07-2019
  •  | 
  •  

سؤال

لمحاولة بعض الاشياء المؤشر، الذي أدليت به متغير مثيل في مشروع قائم. انها اعلنت تماما مثل هذا:

@interface PointerFun : NSObject {
    NSString* test;
}

وليس لدي أي توجيه مترجمproperty، لاsynthesize، لذلك لا جالبة ولا اضع. فقط للاختبار.

وبعد ذلك لدي طريقة، حيث أحاول حول بعض الأمور مع مؤشرات وهذا المتغير المثال. ما أردت فعلا أن تحقق من ما سيحدث عندما تعيين هذا المثال متغير كائن NSString (أو أيا كان الكائن)، وبعد تعيين الكائن، تعيين كائن آخر إلى أن المؤشر الذي I تعيين إلى مثيل فار. اعتقدت أنه من شأنه أن يغير الكائن في منطقة var المثال كما weell.

وحتى هنا رمز بلادي:

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

test = str2; // assign directly to instance variable (bad thing, just for testing!)
str2 = str1; // now lets be really mean and change the object from that pointer!!

NSLog(@"test: %x, %@", test, test); // test: 52cb10, two
NSLog(@"str1: %x, %@", str1, str1); // str1: 52ca60, one 
NSLog(@"str2: %x, %@", str2, str2); // str2: 52ca60, one

وكأنك تراه، المتغير المثال يبقي لافتا إلى كائن NSString التي كانت في وقت مبكر وراء str2. حتى عندما كنت تعيين str1 إلى str2، وتعيين قيمة str1 إلى str2، وهو عنوان الذاكرة. لذلك جعل كل من مؤشرات لها نفس القيمة، أليس كذلك؟

ولكن عندما كنت تعيين قيمة str2 لاختبار، واستغرق الاختبار على القيمة من str2، الذي كان -على أن الزمني عنوان الذاكرة لكائن "اثنين". لذلك حتى لو يمكنني تغيير بعد تلك المهمة قيمة str2 المؤشر، فإنه لن يؤثر على قيمة متغير المثيل و. ولأن هذا هو مؤشر إلى كائن NSString، انها مجرد يتصرف نفسه كما لو كان str1 أو str2. لا يوجد فرق لمجرد انها فار المثال. انها مجرد متغير، أو أفضل: انها مجرد مؤشر. هل يمكنني الحصول على هذا الحق؟ تفو؛) ... نأمل ذلك

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

المحلول

والمتغيرات الثلاثة هي في الواقع مؤشرات (اختبار، str1 str2 و)، وكان لديك 2 كائنات خلقت: "واحد" و "اثنين"

وعند القيام:

test = str2;

وأنت تجعل نقطة الاختبار إلى كائن "اثنين"، وعندما تفعل:

str2 = str1;

وأنت تجعل نقطة str2 إلى كائن "واحد"، والتي لا تؤثر على اختبار على الإطلاق.

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