استخدام العلامة النجمية في الهدف-C: أسئلة ذات صلة

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

سؤال

كان لدي بعض الأسئلة المتعلقة بهذا: استخدام النجمة في Objective-C

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

كيف تعرف متى يتم تخصيص شيء ما على المكدس وعلى الكومة؟ هل جميع المتغيرات المحلية على المكدس وهل جميع المؤشرات على الكومة؟

نظرًا لأنك لا تضعف المؤشر إلى الكائن وأن المؤشر إلى الكائن أمر بالغ الأهمية ضمن تنفيذ الطريقة نفسه. عندما تقول...

هاه

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

المحلول

كيف تعرف متى يتم تخصيص شيء ما على المكدس وعلى الكومة؟ هل جميع المتغيرات المحلية على المكدس ...

لا يهم. المكدس والكومة هي تفاصيل التنفيذ. لا تعرف لغات C و Objective-C عنها ، ويجب ألا يكون لديك عمومًا أي سبب لرعاية ما إذا كان هناك شيء ما على المكدس أو الكومة.

على Mac OS X ، توجد المتغيرات المحلية على المكدس. ولكن ، لجميع الأغراض تقريبًا ، هذا ليس له أي نتيجة. لا تقلق بشأن هذا

... وهل كل مؤشرات على الكومة؟

رقم المؤشرات هي عناوين الذاكرة. هذا كل شئ.

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

نرى البرنامج التعليمي المؤشر الخاص بي للمزيد من المعلومات.

نظرًا لأنك لا تضعف المؤشر إلى الكائن وأن المؤشر إلى الكائن أمر بالغ الأهمية ضمن تنفيذ الطريقة نفسه. عندما تقول...

هاه

المؤشر هو عنوان الذاكرة. على هذا النحو ، فإنه يشير إلى الذاكرة في هذا العنوان. إن إزالة المؤشر هو الوصول إلى تلك الذاكرة.

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

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

لنفترض أنه كان من الممكن إرسال رسالة إلى كائن غير مرغوب فيه. لا تزال القاعدة هي إرسال رسائل إلى مؤشرات إلى كائنات ، لذلك في جميع الاحتمالات ، سيظل الكائن بحاجة إلى هذا المؤشر إلى نفسه - مما يجعل هذه القدرة الافتراضية على إرسال كائن غير مجدي غير مجدي.

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

نصائح أخرى

* هو مشغل dereference لـ C ، C ++ و Objective-C. يعد فهم مشغل Dereference ، وإدارة الذاكرة بشكل عام أوسع بكثير من الهدف-C. هذه مهارة أساسية لأي مطور C/C ++/Objective-C. إلقاء نظرة على العديد من البرامج التعليمية المقدمة على الشبكة لمعرفة المزيد.

تحرير: أي برنامج تعليمي على مؤشرات C سيفعل. كهذه http://home.netcom.com/~tjensen/ptr/pointers.htm

في الكاكاو ، لن تستخدم أبدًا كائنات مخصصة المكدس ؛ سيتم تسليم جميع الكائنات بـ * (تذكر أن نوع "ID" هو حقًا كلمة أخرى لـ "مؤشر لبعض الكائنات") وتم إنشاؤها على الكومة.

سيكون لديك دائمًا هذا:

NSArray     *myArray;

ولا هذا أبدا:

NSArray     myArray;

يمكنك تجاهل الجزء الثاني ، نظرًا لأنك دائمًا ما تخلط المؤشر.

آمل أن تساعدك هذه الأمثلة ساذجة اللعبة.

في C ، في وظيفة ،

int x; // x is a variable of type int in stack
int *xp; // xp is a variable of type int * (pointer to int) in stack
int *xp2 = (int *) malloc(sizeof(int)); // xp2 is a variable in stack, it points to a memory location(size is of int) in heap
xp = &x; // xp can point to x
xp = xp2; // xp can also point to what xp2 points to
free(xp2); // now xp and xp2 point to a freed memory, BAD to use xp and xp2 now.
int **y; // y is a variable in stack, type is int **
y = (int **) malloc(sizeof(int *)); // allocate a piece of memory in heap, to hold a pointer to int(int *)
*y = (int *) malloc(sizeof(int)); // allocate a piece of memory in heap, to hold an int
**y = 100; // now we can use it
free(*y);
free(y);

في C ++ ، في وظيفة أو وظيفة عضو (طريقة) ،

SomeClass a1; // a1 is an object of type SomeClass in stack
SomeClass *a2 = new SomeClass(); // a2 is a pointer(in stack) pointing to an object(of type SomeClass) located in heap
delete a2;

لذلك في C ++ ، يمكن أن توجد الكائنات في المكدس أو الكومة

في جافا ، في وظيفة أو طريقة ،

SomeClass b1; // b1 is just a reference, no object exists yet
b1 = new SomeClass(); // in java, objects can only exist in heap
int x; // however, primitive types are in stack, 

في الهدف-C ، في وظيفة أو طريقة ،

SomeClass c1; // you can't do this.
SomeClass *c2 = [[SomeClass alloca] init]; // c1 is a pointer in stack, pointing to an object in heap
[c2 release];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top