Slide 1: C# on the iPhone with MonoTouch
Chris Hardy follow on Twitter - @chrisntr
Slide 2: http://greatfridays.com
Slide 3: Covering...
• What is MonoTouch? • How does it work? • Why would you use it? • Demos
Slide 4: Starting point....
Slide 5: Objective C and Xcode
Slide 6: Learn to read Objective-C
Slide 7: Learn to read Objective-C
• All Apple documentation is in Obj-C • Most examples are in Obj-C • It’s not too hard to understand • It might even be fun...
Slide 8: What is MonoTouch?
Slide 9: What is Mono?
Slide 10: What is Mono?
Open Source .Net Implementation of the Microsoft .Net Framework
Slide 11: Mono’s JIT Engine
Memory Mono CIL
Slide 12: Apple No No...
• Contractual Requirements • No interpreted code • No shared libraries • Kernel Limitations • iPhone OS 2.0+ disables JIT
Slide 13: Mono’s AOT Engine
Native Code Mono
AOT CIL
Mono Runtime
ARM
Slide 14: • mtouch • MonoDevelop iPhone Add-In • CocoaTouch.NET • Full static AOT compiler • Support for all your existing code • Reflection • Generics • LINQ • Anonymous Methods • Lambda’s etc...
Monotouch Features
Slide 15: MonoTouch’s APIs
Slide 16: The Bindings
• MonoTouch namespace • MonoTouch.Foo namespace • Maps to CocoaTouch’s Foo Framework • 1:1 Mapping of classes. • MonoTouch.UIKit.UILabel • CocoaTouch’s UIKit framework, UILabel
class
Slide 17: Strong Types
• Objective-C • Arrays are weakly typed: • NSArray return values. • MonoTouch has strong types • UIView[] Subviews { get; } • vs • NSArray *subviews; • Intellisense - explore the API...
Slide 18: Garbage Collection
• •
Automatic:
•
Mono’s GC will collect objects on demand
Deterministic:
• •
Use when you need control. Every object in MonoTouch implements IDisposable using (var image = UIImage.FromFile(“foo.png”)){ surface.DrawImage(image, 20, 20); }
Slide 19: Linker
Slide 20: What about App Size?
• 10 MB (compressed) limit on 3G/Edge
downloads
• .Net BCL and other libraries are huge • Mono Linker to the rescue!
Slide 21: Linking Assemblies
Slide 22: Linker Options
• No Link • Link SDK Only • Full Link
Slide 23: Pipeline
• Interface Builder GUI Designer • Exact same tool used by Xcode • Support for existing Xcode interfaces • MonoDevelop IDE
Slide 24: Integration
• Tight integration between MD and IB • IB produces XIBs with MD parses • Automatic class generation in MD • Generates partial classes for all types,
outlets and actions defined in Interface Builder
Slide 25: Outlets
• Instance Variables • Can be strong or loosely typed • MD will strong type
Slide 26: Actions
• Objects emit broadcast messages to
receivers
• You can do this C# • MonoDevelop takes care of the details for
you
• Creates partial methods for you extend
Slide 27: MonoTouch Events
• Supports Objective-C pattern:
webView.Delegate = new MyWebViewDelegate();
• C# style events as well:
webView.PageLoaded += delegate { HideSpinningWheel(); }
Slide 28: Debugging
• Console.WriteLine(“Debugging inside of
MonoTouch”);
• printf(“I made it to this line!\n”)
Slide 29: Well...
• MonoTouch released around 15th
September 2009
• MonoTouch 1.1 on 2nd October 2009 • MonoTouch 1.2 (Beta) released on 28th • Currently on MonoTouch 1.4.5
October 2009... With Debugging support
Slide 30: Debugger
• MonoTouch debugger leverages Mono’s
new Soft-Debugger
• Supports the Simulator • Supports the Device... • even over WiFi
Slide 31: Debugger Features
• Breakpoints • Catchpoints • Inspection • Watches • Immediate / Expression Evaluator • Call Stack • Stepping
Slide 32: Caveats
• Debug binaries on devices are very large • Cannot debug Main or FinishedLaunching
on device
• Consumes more memory runtime • Performance hit
Slide 33: Getting started
• Get iPhone SDK from Apple • Get Mono from Novell • Get MonoTouch (evaluation version is free) • Get MonoDevelop • Register with Apple iPhone Developer
Program and purchase MonoTouch for putting apps on device and AppStore.
Slide 34: One more thing...
Slide 35: iPad
• But you want to develop for the iPad... • 24 Hours after the SDK was released... • MonoTouch support for iPad
Slide 36: Demo time...
Slide 37: Q +A twitter.com/chrisntr chrisntr@gmail.com