SlideShare a Scribd company logo
iOS Internals and Best Practices
             Blain Hamon & Max Stepanov
               Senior Software Engineers
                    Appcelerator, Inc.
             @blainhamon @maxstepanov

  bhamon@appcelerator.com mstepanov@appcelerator.com
iOS Internals


                • History

                • Structure

                • Responsive Apps

                • Memory-Light Apps

                • Fast-Performing Apps

                • Fast-Drawing Apps
iOS Internals


                • History

                • Structure

                • Responsive Apps

                • Memory-Light Apps

                • Fast-Performing Apps

                • Fast-Drawing Apps
Ti.API.prehistory



                    • 2009: Versions 0.3-0.8

                    • Based on web views

                    • Native via JSON service

                    • Drew upon Ti:Desktop
Ti.API.today



               • 2010+: Versions 0.9+

               • Built-in Interpreters

               • Native via JS callbacks

               • Focused on Mobile
iOS Internals


                • History

                • Structure

                • Responsive Apps

                • Memory-Light Apps

                • Fast-Performing Apps

                • Fast-Drawing Apps
App To The Future


•   Native OS




                        Native OS
App To The Future


•   Native OS

•   OS Abstraction Layer




                           OS Abstraction Layer

                                            Native OS
App To The Future


•   Native OS

•   OS Abstraction Layer

•   Ti Binding (Kroll)



                           OS Abstraction Layer     Ti Binding (Kroll)

                                            Native OS
App To The Future


•   Native OS

•   OS Abstraction Layer

•   Ti Binding (Kroll)
                                       Ti Foundation Layer
•   Ti Foundation Layer
                           OS Abstraction Layer     Ti Binding (Kroll)

                                            Native OS
App To The Future


•   Native OS

•   OS Abstraction Layer
                           UI     App     Network       Other Modules…
•   Ti Binding (Kroll)
                                        Ti Foundation Layer
•   Ti Foundation Layer
                           OS Abstraction Layer      Ti Binding (Kroll)
•   Modules
                                            Native OS
iOS Internals


                • History

                • Structure

                • Responsive Apps

                • Memory-Light Apps

                • Fast-Performing Apps

                • Fast-Drawing Apps
Game of Threads

                              User taps button
UI-triggered event:
                              User taps button   EventListener
•   UI asynchronously
    triggers event listener

•   UI is ready for more
    action while JS                              EventListener
    processes.
Game of Threads


JS-triggered events:
                                 fireEvent(‘foo’);
•   Still asychronous           setTimeout(0,ƒ());

•   First in, first out queue
                                  EventListener

                                Timeout Function
Game of Threads

                                User taps button
Expensive listeners:            User taps button
                                User taps button   EventListener
•   Still first in, first out

•   Delayed responses


                                                   EventListener




                                                   EventListener
Game of Threads

                            User taps button
Options:                    User taps button
                            User taps button   EventListener
•   Block user              Button covered
    interaction, but only
    as a last resort


                                               EventListener




                                               EventListener
Game of Threads

                            User taps button 1
Options:                    User taps button 2   EventListener 1

•   Block user                                   EventListener 2
    interaction, but only
    as a last resort                             EventListener 1.1

•   Break up expensive                           EventListener 1.2
    listeners
iOS Internals


                • History

                • Structure

                • Responsive Apps

                • Memory-Light Apps

                • Fast-Performing Apps

                • Fast-Drawing Apps
My Little Memory


•   In global      held1 = {foo:5};
    namespace
My Little Memory


•   In global           held1 = {foo:5};
    namespace

•   In a closure of a   foo = (function(){
    function               var held2=0;
                           return function()
                              {return held2++;};
                        })();
My Little Memory


•   In global           held1 = {foo:5};
    namespace

•   In a closure of a   foo = (function(){
    function               var held2=0;
                           return function()
•   Property of a
    retained object           {return held2++;};
                        })();

                        foo.bar = held3;
                        foo.add(held4);
My Little Memory


•   In global           held1 = {foo:5};
    namespace

•   In a closure of a   foo = (function(){
    function               var held2=0;
                           return function()
•   Property of a
    retained object           {return held2++;};
                        })();
•   Artificially
    retained via
    Titanium            foo.bar = held3;
                        foo.add(held4);

                        held5.open();
My Little Memory


•   Be aware of      held1 = {foo:5};
    variable scope

•   “nulling out”    foo = (function(){
                        var held2=0;
                        return function()
                           {return held2++;};
                     })();

                     foo.bar = held3;
                     foo.add(held4);

                     held5.open();
iOS Internals


                • History

                • Structure

                • Responsive Apps

                • Memory-Light Apps

                • Fast-Performing Apps

                • Fast-Drawing Apps
Class of the Titans


•   Proxies represent
    Titanium objects
                                        Ti Proxy
•   Proxies are
    threadsafe
                            UIView Object     Ti Binding Object   JS Object
•   Proxies store data as
    a native copy
Class of the Titans


•   Proxies represent
    Titanium objects
                                        Ti Proxy
•   Proxies are
    threadsafe
                            UIView Object     Ti Binding Object   JS Object
•   Proxies store data as
    a native copy
                                                   (Method)       JS Object
•   Method objects are
    generated
Class of the Titans


•   Native can be
    expensive
                                        Ti Proxy
•   Cache when possible

•   Use properties          UIView Object     Ti Binding Object   JS Object
    instead of setters

•   Pass properties in                             (Method)       JS Object
    creators

•   Use applyProperties()
iOS Internals


                • History

                • Structure

                • Responsive Apps

                • Memory-Light Apps

                • Fast-Performing Apps

                • Fast-Drawing Apps
Epic View Time



                 • iOS uses OpenGL underneath

                 • Views cache as textures

                 • Opaque textures are faster

                 • Resizing can be expensive

                 • Transparency can be expensive
Epic View Time



                 iOS uses OpenGL underneath
                 • Views cache as textures
                 • Opaque textures are faster
                 • Rendering happens often

                 Some behaviors are expensive
                 • Resizing view sizes
                 • Transparent/views with alpha
                 • Dynamic graphics
Epic View Time
                 var row = Ti.UI.createTableViewRow({
                     height:Ti.UI.SIZE,
                     layout:'horizontal’
                 });
                 row.add(Ti.UI.createImageView({
                     image: myUrl,
                     top: 10,
                     height:89,
                     bottom:11,
                     left: 0,
                     width:125
                 }));
                 row.add(Ti.UI.createLabel({
                     text: myText,
                     left:5,
                     width:Ti.UI.SIZE,
                     height:Ti.UI.SIZE
                 }));
Epic View Time
                 var row = Ti.UI.createTableViewRow({
                     height:Ti.UI.SIZE,
                     layout:'horizontal’
                 });
                 row.add(Ti.UI.createImageView({
                     image: myUrl,
                     top: 10,
                     height:89,
                     bottom:11,
                     left: 0,
                     width:125
                 }));
                 row.add(Ti.UI.createLabel({
                     text: myText,
                     left:5,
                     width:Ti.UI.SIZE,
                     height:Ti.UI.SIZE
                 }));
Epic View Time
                 var row = Ti.UI.createTableViewRow({
                     height:100
                 });
                 row.add(Ti.UI.createImageView({
                     image: myUrl,
                     top: 10,
                     height:89,
                     bottom:11,
                     left: 0,
                     width:125,
                     backgroundColor:'white'
                 }));
                 row.add(Ti.UI.createLabel({
                     text: myText,
                     top:0,
                     left:130,
                     right:0,
                     bottom:0,
                     backgroundColor:'white'
                 });
iOS Internals

                Being responsive:
                • Block UI as last resort
                • Break up expensive tasks

                Being memory-efficient:
                • Mind native object references

                Being fast:
                • Cache when possible
                • Reduce using native containers
                • Concentrate property setting

                Being fast-rendering:
                • Aim for static, opaque views
iOS Debugging
New in Titanium




    Titanium 1.7    Titanium 3.0




   iOS Simulator
                   Physical Devices
Device Debugging

                   • Install with iTunes

                   • Requires network connectivity
                     between development machine
                     and a device

                   • Local WiFi or Hotspot

                   • iPhone Personal Hotspot via
                     WiFi, Bluetooth or USB

                   • Titanium Studio will do the best to
                     locate your device(s)!
Debugging Tips


                           • Turn off Auto-Lock on device



                           • Ensure same WiFi network



                           • Don’t forget to launch your app



    http://docs.appcelerator.com/titanium/3.0/ Debugging on iOS Devices
Game of Threads

                             User taps button 1
                                                  EventListener 1
•   UI thread for handling                            var x = 1;
    user interactions                               Ti.API.log(x);
                                                     openWin(x);
•   JS thread for the        postlayout event
    application logic                              Geo location
                                                    Function         Run
•   Debugger thread for
    communications with                           EventListener 2
    Titanium Studio                                      Line 1
                                                            Line 2
•   Other iOS platform                                      Line 3
    threads
Best Practices


                 • Use conditional breakpoints

                    • A block of JavaScript code

                    • Hit count


                 • Use Console logging with
                   Ti.API functions
Blain Hamon & Max Stepanov
            @blainhamon @maxstepanov

bhamon@appcelerator.com   mstepanov@appcelerator.com

More Related Content

PPTX
Introduction to JAVA
PPT
The economies of scaling software - Abdel Remani
PPTX
Stop Debating, Start Measuring
DOC
بوكلت منهج اللغة العربية الصف الثانى الابتدائى الفصل الدراسى الثانى بصيغة ال...
PDF
القرائية للصف الثانى الابتدائى ترم 2
PDF
بوكلت تدريبات اللغة العربية المعدل للصف الثانى الابتدائى الفصل الدراسى الأول ...
PDF
بوكلت الأساليب للصف الثانى الابتدائى للترم الثانى لمدارس نيرمين إسماعيل للغا...
PDF
تدريبات اللغة العربية لكتاب سلاح التلميذ الصف الثانى الابتدائى الترم الأول
Introduction to JAVA
The economies of scaling software - Abdel Remani
Stop Debating, Start Measuring
بوكلت منهج اللغة العربية الصف الثانى الابتدائى الفصل الدراسى الثانى بصيغة ال...
القرائية للصف الثانى الابتدائى ترم 2
بوكلت تدريبات اللغة العربية المعدل للصف الثانى الابتدائى الفصل الدراسى الأول ...
بوكلت الأساليب للصف الثانى الابتدائى للترم الثانى لمدارس نيرمين إسماعيل للغا...
تدريبات اللغة العربية لكتاب سلاح التلميذ الصف الثانى الابتدائى الترم الأول

Similar to Codestrong 2012 breakout session i os internals and best practices (20)

PDF
Fred Spencer & Blain Hamon: Advanced Titanium for iOS
PDF
mobl
PPTX
Eco system apps
PDF
The Evolution of Async-Programming (SD 2.0, JavaScript)
KEY
Kirin - Making Single Page Web Apps with a Native UI
PPTX
Introduction to MonoTouch
PDF
Where Node.JS Meets iOS
PDF
There's more than web
PDF
Mobile Controls for IBM Lotus Domino XPages on OpenNTF 09/10
PPTX
Cross-platform development on mobile devices
PPTX
OGDC2012 Cross-Platform Development On Mobile Devices_Mr.Takaaki Mizuno_DeNA
PDF
An Introduction to Sencha Touch
PPTX
Titanium Appcelerator - Beginners
PPTX
MonoTouch 5.2 Introduction
PDF
JavaScript 101
PPTX
Intro to appcelerator
PDF
Douglas Crockford: Serversideness
PDF
Symfony & Javascript. Combining the best of two worlds
KEY
Building Mobile Apps with HTML, CSS, and JavaScript
PDF
Creating and Distributing Mobile Web Applications with PhoneGap
Fred Spencer & Blain Hamon: Advanced Titanium for iOS
mobl
Eco system apps
The Evolution of Async-Programming (SD 2.0, JavaScript)
Kirin - Making Single Page Web Apps with a Native UI
Introduction to MonoTouch
Where Node.JS Meets iOS
There's more than web
Mobile Controls for IBM Lotus Domino XPages on OpenNTF 09/10
Cross-platform development on mobile devices
OGDC2012 Cross-Platform Development On Mobile Devices_Mr.Takaaki Mizuno_DeNA
An Introduction to Sencha Touch
Titanium Appcelerator - Beginners
MonoTouch 5.2 Introduction
JavaScript 101
Intro to appcelerator
Douglas Crockford: Serversideness
Symfony & Javascript. Combining the best of two worlds
Building Mobile Apps with HTML, CSS, and JavaScript
Creating and Distributing Mobile Web Applications with PhoneGap
Ad

More from Axway Appcelerator (20)

PDF
Axway Appcelerator - Titanium SDK 6.1.0 - Status, Releases & Roadmap
PPTX
2014 Dublin Web Summit by Jeff Haynie
PPTX
Making the Mobile Mind Shift
PPTX
Mobile & The New Experience Economy (And What it Means for IT)
PPTX
Apps, APIs & Analytics: What "Mobile First" Really Means
PPTX
Appcelerator Presentation Template
PPTX
Codestrong 2012 keynote jonathan rende, appcelerator's vp of products
PPTX
Codestrong 2012 keynote jeff haynie, appcelerator's ceo
PPTX
Codestrong 2012 keynote how to build a top ten app
PPTX
Codestrong 2012 breakout session at&t api platform and trends
PPTX
Codestrong 2012 breakout session what's new in titanium studio
PPTX
Codestrong 2012 breakout session using appcelerator cloud services in your ...
PPTX
Codestrong 2012 breakout session the role of cloud services in your next ge...
PPTX
Codestrong 2012 breakout session new device platform support for titanium
PPTX
Codestrong 2012 breakout session mobile platform and infrastructure
PPTX
Codestrong 2012 breakout session making money on appcelerator's marketplace
PDF
Codestrong 2012 breakout session live multi-platform testing
PPTX
Codestrong 2012 breakout session leveraging titanium as part of your mobile...
PPTX
Codestrong 2012 breakout session introduction to mobile web and best practices
PPTX
Codestrong 2012 breakout session how to win bigger mobile deals
Axway Appcelerator - Titanium SDK 6.1.0 - Status, Releases & Roadmap
2014 Dublin Web Summit by Jeff Haynie
Making the Mobile Mind Shift
Mobile & The New Experience Economy (And What it Means for IT)
Apps, APIs & Analytics: What "Mobile First" Really Means
Appcelerator Presentation Template
Codestrong 2012 keynote jonathan rende, appcelerator's vp of products
Codestrong 2012 keynote jeff haynie, appcelerator's ceo
Codestrong 2012 keynote how to build a top ten app
Codestrong 2012 breakout session at&t api platform and trends
Codestrong 2012 breakout session what's new in titanium studio
Codestrong 2012 breakout session using appcelerator cloud services in your ...
Codestrong 2012 breakout session the role of cloud services in your next ge...
Codestrong 2012 breakout session new device platform support for titanium
Codestrong 2012 breakout session mobile platform and infrastructure
Codestrong 2012 breakout session making money on appcelerator's marketplace
Codestrong 2012 breakout session live multi-platform testing
Codestrong 2012 breakout session leveraging titanium as part of your mobile...
Codestrong 2012 breakout session introduction to mobile web and best practices
Codestrong 2012 breakout session how to win bigger mobile deals
Ad

Codestrong 2012 breakout session i os internals and best practices

  • 1. iOS Internals and Best Practices Blain Hamon & Max Stepanov Senior Software Engineers Appcelerator, Inc. @blainhamon @maxstepanov bhamon@appcelerator.com mstepanov@appcelerator.com
  • 2. iOS Internals • History • Structure • Responsive Apps • Memory-Light Apps • Fast-Performing Apps • Fast-Drawing Apps
  • 3. iOS Internals • History • Structure • Responsive Apps • Memory-Light Apps • Fast-Performing Apps • Fast-Drawing Apps
  • 4. Ti.API.prehistory • 2009: Versions 0.3-0.8 • Based on web views • Native via JSON service • Drew upon Ti:Desktop
  • 5. Ti.API.today • 2010+: Versions 0.9+ • Built-in Interpreters • Native via JS callbacks • Focused on Mobile
  • 6. iOS Internals • History • Structure • Responsive Apps • Memory-Light Apps • Fast-Performing Apps • Fast-Drawing Apps
  • 7. App To The Future • Native OS Native OS
  • 8. App To The Future • Native OS • OS Abstraction Layer OS Abstraction Layer Native OS
  • 9. App To The Future • Native OS • OS Abstraction Layer • Ti Binding (Kroll) OS Abstraction Layer Ti Binding (Kroll) Native OS
  • 10. App To The Future • Native OS • OS Abstraction Layer • Ti Binding (Kroll) Ti Foundation Layer • Ti Foundation Layer OS Abstraction Layer Ti Binding (Kroll) Native OS
  • 11. App To The Future • Native OS • OS Abstraction Layer UI App Network Other Modules… • Ti Binding (Kroll) Ti Foundation Layer • Ti Foundation Layer OS Abstraction Layer Ti Binding (Kroll) • Modules Native OS
  • 12. iOS Internals • History • Structure • Responsive Apps • Memory-Light Apps • Fast-Performing Apps • Fast-Drawing Apps
  • 13. Game of Threads User taps button UI-triggered event: User taps button EventListener • UI asynchronously triggers event listener • UI is ready for more action while JS EventListener processes.
  • 14. Game of Threads JS-triggered events: fireEvent(‘foo’); • Still asychronous setTimeout(0,ƒ()); • First in, first out queue EventListener Timeout Function
  • 15. Game of Threads User taps button Expensive listeners: User taps button User taps button EventListener • Still first in, first out • Delayed responses EventListener EventListener
  • 16. Game of Threads User taps button Options: User taps button User taps button EventListener • Block user Button covered interaction, but only as a last resort EventListener EventListener
  • 17. Game of Threads User taps button 1 Options: User taps button 2 EventListener 1 • Block user EventListener 2 interaction, but only as a last resort EventListener 1.1 • Break up expensive EventListener 1.2 listeners
  • 18. iOS Internals • History • Structure • Responsive Apps • Memory-Light Apps • Fast-Performing Apps • Fast-Drawing Apps
  • 19. My Little Memory • In global held1 = {foo:5}; namespace
  • 20. My Little Memory • In global held1 = {foo:5}; namespace • In a closure of a foo = (function(){ function var held2=0; return function() {return held2++;}; })();
  • 21. My Little Memory • In global held1 = {foo:5}; namespace • In a closure of a foo = (function(){ function var held2=0; return function() • Property of a retained object {return held2++;}; })(); foo.bar = held3; foo.add(held4);
  • 22. My Little Memory • In global held1 = {foo:5}; namespace • In a closure of a foo = (function(){ function var held2=0; return function() • Property of a retained object {return held2++;}; })(); • Artificially retained via Titanium foo.bar = held3; foo.add(held4); held5.open();
  • 23. My Little Memory • Be aware of held1 = {foo:5}; variable scope • “nulling out” foo = (function(){ var held2=0; return function() {return held2++;}; })(); foo.bar = held3; foo.add(held4); held5.open();
  • 24. iOS Internals • History • Structure • Responsive Apps • Memory-Light Apps • Fast-Performing Apps • Fast-Drawing Apps
  • 25. Class of the Titans • Proxies represent Titanium objects Ti Proxy • Proxies are threadsafe UIView Object Ti Binding Object JS Object • Proxies store data as a native copy
  • 26. Class of the Titans • Proxies represent Titanium objects Ti Proxy • Proxies are threadsafe UIView Object Ti Binding Object JS Object • Proxies store data as a native copy (Method) JS Object • Method objects are generated
  • 27. Class of the Titans • Native can be expensive Ti Proxy • Cache when possible • Use properties UIView Object Ti Binding Object JS Object instead of setters • Pass properties in (Method) JS Object creators • Use applyProperties()
  • 28. iOS Internals • History • Structure • Responsive Apps • Memory-Light Apps • Fast-Performing Apps • Fast-Drawing Apps
  • 29. Epic View Time • iOS uses OpenGL underneath • Views cache as textures • Opaque textures are faster • Resizing can be expensive • Transparency can be expensive
  • 30. Epic View Time iOS uses OpenGL underneath • Views cache as textures • Opaque textures are faster • Rendering happens often Some behaviors are expensive • Resizing view sizes • Transparent/views with alpha • Dynamic graphics
  • 31. Epic View Time var row = Ti.UI.createTableViewRow({ height:Ti.UI.SIZE, layout:'horizontal’ }); row.add(Ti.UI.createImageView({ image: myUrl, top: 10, height:89, bottom:11, left: 0, width:125 })); row.add(Ti.UI.createLabel({ text: myText, left:5, width:Ti.UI.SIZE, height:Ti.UI.SIZE }));
  • 32. Epic View Time var row = Ti.UI.createTableViewRow({ height:Ti.UI.SIZE, layout:'horizontal’ }); row.add(Ti.UI.createImageView({ image: myUrl, top: 10, height:89, bottom:11, left: 0, width:125 })); row.add(Ti.UI.createLabel({ text: myText, left:5, width:Ti.UI.SIZE, height:Ti.UI.SIZE }));
  • 33. Epic View Time var row = Ti.UI.createTableViewRow({ height:100 }); row.add(Ti.UI.createImageView({ image: myUrl, top: 10, height:89, bottom:11, left: 0, width:125, backgroundColor:'white' })); row.add(Ti.UI.createLabel({ text: myText, top:0, left:130, right:0, bottom:0, backgroundColor:'white' });
  • 34. iOS Internals Being responsive: • Block UI as last resort • Break up expensive tasks Being memory-efficient: • Mind native object references Being fast: • Cache when possible • Reduce using native containers • Concentrate property setting Being fast-rendering: • Aim for static, opaque views
  • 36. New in Titanium Titanium 1.7 Titanium 3.0 iOS Simulator Physical Devices
  • 37. Device Debugging • Install with iTunes • Requires network connectivity between development machine and a device • Local WiFi or Hotspot • iPhone Personal Hotspot via WiFi, Bluetooth or USB • Titanium Studio will do the best to locate your device(s)!
  • 38. Debugging Tips • Turn off Auto-Lock on device • Ensure same WiFi network • Don’t forget to launch your app http://docs.appcelerator.com/titanium/3.0/ Debugging on iOS Devices
  • 39. Game of Threads User taps button 1 EventListener 1 • UI thread for handling  var x = 1; user interactions Ti.API.log(x); openWin(x); • JS thread for the postlayout event application logic Geo location Function Run • Debugger thread for communications with EventListener 2 Titanium Studio  Line 1 Line 2 • Other iOS platform Line 3 threads
  • 40. Best Practices • Use conditional breakpoints • A block of JavaScript code • Hit count • Use Console logging with Ti.API functions
  • 41. Blain Hamon & Max Stepanov @blainhamon @maxstepanov bhamon@appcelerator.com mstepanov@appcelerator.com