שמעתם על בלוקים ב-iOS

guyiphone

New member
שמעתם על בלוקים ב-iOS ../images/Emo35.gif

iOS 4 מציגה בין היתר תכונה חדשה שעשויה לשנות מן היסוד את הדרך בה אתם מפתחים באופן כללי. מדובר בבלוקים ! (או קוביות איך שתרצו) הבלוקים הם למעשה הרחבה לשפת C ולכך תמיכה מלאה ב Objective-C. אם אתם מכירים שפות תכנות כגון רובי, פייתון או ליספ, אז אתם וודאי יודעים את הכוח הטמון בבלוקים. במילים פשוטות, עוזר לך לתמצת גושי קוד (encapsulate) ולהשתמש בהם בצורה גנרית קלה לגמרי ככל אובייקט אחר. חברים, זה סגנון שונה של תכנות מפני שאתם יכולים בעזרתו לעשות דברים שעד עכשיו לא חשבתם שתוכלו ובטח לא בכזו קלות ובכך למעשה לנצל את ממשקי API חדשים iOS 4. בואו נראה איך עושים את זה עם שתי דוגמאות שבהם תוכל להשתמש בבלוקים ב iOS 4:
[UIView animateWithDuration:2.0 animations:^ { self.cardView.alpha = 1.0; self.cardView.frame = CGRectMake(176.0, 258.0, 72.0, 96.0); self.cardView.transform = CGAffineTransformMakeRotation(M_PI); } ];​
והשניה:
NSArray *cards = [NSArray arrayWithObjects:mad:"Jack", @"Queen", @"King", @"Ace", nil]; [cards enumerateObjectsUsingBlock:^ (id object, NSUInteger index, BOOL *stop) { NSLog(@"%@ card at index %d", object, index); }];​
בדוגמה הראשונה: בדוגמה זו נניח שאנו יוצרים משחק קלפים ואנחנו רוצים ליצור הנפשה ע"י הזזת כרטיס מידו של ה"סוחר" למיקומו של השחקן. למזלנו, ה- UIKit יכול לעשות עבורינו את כל העבודה השחורה כשמדובר באנימציות (אפילו המורכבות שבהן). ולמרות שפונקציות האנימציה מאוד כלליות הרי שהיא בקלות יכולה להתאים עצמה ליישום הספציפי שלך. אתם כמפתחים, קובעים מה יהיה אופיין האנימציה בבלוק עם הכרזה על המאפיינים הרצויין בתוך בלוק של animateWithDuration... אתם מוזמנים לנסות ! באשר לדוגמה השניה, הייתי רוצה את התערבותכם ולשמוע מכם מה זה עושה ... ואיך אולי אתם הייתם עושים את זה אחרת .... אשמח לקבל רעיונות ליישומים נוספים של הבלוקים, אולי עם העברת פרמטרים או עם גרפיקה יותר עשירה ... ובכלל אם יש מי שיתנגד לצורת הכתיבה הזו ... אשמח לשמוע ! שיהיה בהצלחה לכולם !
 

BravoMan

Active member
הייתי סקרן אז חיפשתי ב-google

והגעתי לבלוג הזה (שנראה לי כי הוא גם המקור שלך): http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1 לפי מה שהבנתי משם מדובר למעשה בספין חדש למושג הישן של פונקציית callback אם תוספת מעניית אחת: בניגוד לפונקציה, בלוק יוצר "צילום" של כל המשתנים שנמצאים בשימוש בתוכו ומשתמש בצילום זה בכל קריא נוספת במקום בערכים האמתיים של המשתנים. למען האמת אני לא מצליח לחשוב על מצב שבו דבר כזה יהיה יתרון ולא חסרון שכן זה בזבוז זיכרון מיותר וגם לרוב רוצים להשתמש בערך הנוכחי של משתנה מסוים ולא ערך שנשמר באקראי מאיזו שהיא קריאה קודמת לפונקציה. אבל מי יודע, אולי ימצא לזה שימוש. מתכנתי Objective-C גם ככה רגילים לתחביר מוזר, אז מה זה עוד מוזרות אחת
 

guyiphone

New member
לא הייתי קופץ למסקנות ...

בתור אחד שבבוקר מנהל פיתוח ב .NET ובלילה מפתח ב- Objective-C הייתי מאוד רוצה להרגיש את אותה הנוחות שיש לי עם אפל ב- MS. לוקח לסטודנטים שלי בד"כ אפליקציה אחת פשוטה להתרגל לאופן הכתיבה המאוד ידידותי (כן כן, הכל עניין של הרגל). אני דווקא כן מצליח לחשוב על פתרונות יפים שאפשר ליישם בהם את השיטה. השיטה אינה צורכת זיכרון יותר מאשר שהיית כותב הכל במפורש ולפעמים, תתפלא, זה דווקא "מוזיל" (אחרי בדיקה ב- Instruments). השיטה תומכת במטודולגית האנקפסולציה ומגדירה מחדש את גבול יכולת השפה ... דבר יפה כשלעצמו, לא חושב?
 

BravoMan

Active member
אני לא אגיד שום דבר על NET.

זה מפתה, אבל לא כאן המקום לדון על כך. מה שכן, אני לא מבין איך השיטה יכולה "להוזיל" את עלויות הזיכרון של ה-block? כפי שהנבתי זאת, אם בתוך בלוק התייחסנו למשתנה גלובלי בשם var, אז בכל קריאה נוספת לבלוק, הערך של var בתוך הבלוק יהיה כפי שהוא היה בקריאה ראשונה, ולא כפי שהוא עכשיו. כדי לעשות זאת חייבים לשמור עותק מקומי של var. וזה אומר הקצעה נוספת של כמו זיכרון ש-var תופס. אם התכוונו לשמור את var בכול מקרה והיינו יוצרים משתנה סטטי מקומי שמעתיקים לתוכו את הערך, צריכת הזיכרון היית זהה, אבל אם אין לנו צורך לעשות זאת, יש צריכת זיכרון מיותרת. אני לא יודע מה ראיתה ב-instruments, אבל אני לא מצליח לחשוב על שום צורה שיכול לצאת כאן חיסכון. (אני לא מתיימר להיות חכם יותר ממהנדסי Apple, אבל זה סה"כ עניין של הגיון פשוט) כמובן, שעם שפה גבוהה כמו Objective-C חייבים לזכור שהקומפיילר מייצר המון קוד "מאחורי הקלעים" (ניהול vtable וכו') ולכן קשה מאוד לעמוד את צריכת הזיכרון של התוכנה במדויק ידנית, מהקוד עצמו. הייתכן שהחיסכון שראיתה נבע משינוי במקום אחר?
 
למעלה