2. New in Xamarin.iOS
• Features added in the last year
– Based on the Mono 2.10/Silverlight-ish stack
• Features based on the Beta channel:
– Mono 3.0-based stack
– SGen GC
– Based on the .NET 4.5 API surface
Released
Beta
4. F# Support
• Functional Programming comes to iOS!
• The pitch is simple:
– Fewer bugs
– Focus on intent
– Reuse C# libraries, experience
– More features, less time
Beta
8. New: SmartLink
• By default, all native code is linked-in
• SmartLink merges Mono and System linker
– Only code that is directly referenced is included
– Caveat: dynamic Objective-C code can fail
– Big savings:
Beta
12. Generic Value Type Sharing
• Reduces these kinds of errors:
Unhandled Exception: System.ExecutionEngineException: Attempting to
JIT compile method
• By generating generics code that can be shared across
value types
– like reference types today
• Enables more LINQ, RX and other generic-rich apps to run
without changes, or without manual static stubs
Beta
13. Source of the Error
• Static compiler is unable to infer that certain
generic methods will be used at runtime with
a specific value type.
• Because the instantiations are delayed until
runtime.
Beta
14. Generic Sharing
• Consider: List<T>.Add (T x)
• If “T” is a reference type:
– Code can be shared between all reference types
– Only one List<RefType>.Add (RefType x) exists
– Because all reference types use same storage (one
pointer).
Beta
15. Generics and Value Types
• Value types use different storage:
– byte – 1 byte
– int – 4 bytes
– long – 8 bytes
• List<byte>.Add (byte x) has different code
than List<long>.Add (long x)
Beta
16. Generic Sharing Today
• Using string, Uri, object, int, long on Add:
– Generates one shareable for Uri, object, string
– Generates one for int
– Generates one for long
17. With new Generic Value Type Sharing
• Using string, Uri, object, int, long on Add:
– Generates one shareable for Uri, object, string
– Generates one for int
– Generates one for long
– Generates a value-type shareable
• Can be used by dynamic users of Add<ValueType>
Beta
18. Shareable Value Type Generic
• Runtime fallback for generic instantiations that
could not be statically computed
• Uses a “fat” value type
• Generates code that copies “fat” value types
• Limitation: large value types can not be shared
• You can disable if not needed:
– -O=-gsharedvt
Beta
19. Cost of Value Type Sharing
6,200
6,400
6,600
6,800
7,000
7,200
7,400
7,600
4.2.2 5.0.4 5.2.13 5.4.1 6.0.10
iOS 6
6.2.1 6.3.3.2
Async
(Mono3)
VT
Sharing
Size in KB Size in KB
394 Kb
Today: For TweetStation, the cost is 394kb
We are working to reduce this
Beta
20. Native Crypto
• System.Security.Cryptography now
powered by iOS native CommonCrytpo
• Covers
– Symmetric crypto
– Hash functions
• Hardware accelerated
– AES and SHA1 (when plugged)
• Made binaries using crypto/https 100k lighter
Released
21. SGen
• SGen can now be used in production on iOS
• It is no longer slower than Boehm
• And much faster on most scenarios
Beta
23. NSObject.Description
• New API that provides Objective-C “ToString”
• NSObject.ToString() calls Description
• Sometimes overwritten
– You can always call NSObject.Description
Released
24. Helping you write Threaded Apps
• UIKit is not thread safe
– No major commercial UI toolkit is thread safe
– Thread safety is just too hard for toolkits
• Very few UIKit methods are thread safe
• During debug mode, you get an exception
Released
25. UIApplication.CheckForIllegalCrossThreadCalls
• If set, accessing UI elements
– Throws UIKitThreadAccessException
• Most UIKit classes/methods
• UIViewController implemented outside UIKit
• Checks enabled on Debug, disabled on Release builds
– Force use: --force-thread-check
– Force removal: --disable-thread-check
Released
26. Thread Safe APIs
Thread Safe Classes
• UIColor
• UIDocument
• UIFont
• UIImage
• UIBezierPath
• UIDevice
Key Thread Safe Methods
• UIApplication.SharedApplica
tion, Background APIs
• UIView.Draw
See API docs for
[ThreadSafe] attribute
Released
28. Async Support
• Base Class Libraries:
– Expect all the standard Async APIs from .NET BCL
– Coverage is .NET 4.5 Complete for BCL
• MonoTouch specific:
• 114 methods on the beta
• Easy to turn ObjC methods into Async ones
– Details on the Objective-C bindings talk
Beta
29. Async Synchronization Contexts
• For UI thread, we run a UIKit Sync Context
– What you get from the main thread
– Code resumes execution on UIKit thread
– Using async just works
– Transparent
• Grand Central Dispatch Sync Context
– If you are running on a GCD DispatchQueue
– Will resume/queue execution on the current queue
Beta
30. General Async Pattern
• Methods with the signature:
void Operation (…, Callback onCompletion)
• Become:
Task OperationAsync (…)
Beta
32. More Strong Type Constructors
• Where you saw
– NSDictionary options
• We now support strongly typed overloads
– Give preference to strongly typed overloads
– Reduce errors
– Trips to the documentation
– Unintended effects
Released
33. Screen Capture
• To capture UIKit views:
– UIScreen.Capture ()
• To capture OpenGL content:
– iPhoneOSGameView.Capture ()
Released
34. UIGestureRecognizers
Before
void Setup ()
{
var pan= new UIPanGestureRecognizer (
this, new Selector (”panHandler"));
view.AddGestureRecognizer (pan);
}
[Export(”panHandler")]
void PanImage (UIPanGestureRecognizer rec)
{
// handle pan
}
Problems:
• Error prone: Parameter of PanImage must be right type
• No checking (mismatch in selector names)
Now
void Setup ()
{
var pan = new UIPanGestureRecognizer (PanImage);
view.AddGestureRecognizer (pan);
}
void PanImage (UIPanGestureRecognizer rec)
{
// handle pan
}
Pros:
• Compiler enforced types
• No selectors to deal with
Released
35. UIAppearance
• Previously:
var appearance = CustomSlider.Appearance;
appearance.SetMaxTrackImage (maxImage, UIControlState.Normal);
– Problem: does not work for subclasses
• Now:
var appearance = CustomSlider.GetAppearance<CustomSlider> ();
appearance.SetMaxTrackImage (maxImage, UIControlState.Normal);
Released
36. Notifications
• Used in iOS/OSX to broadcast messages
– Untyped registration
– Notification payload is an untyped NSDictionary
• Typically require a trip to the docs:
– To find out which notifications exist
– To find what keys exist in the dictionary payload
– To find out the types of the values in dictionary
Released
37. Xamarin.iOS Notifications
• Discoverable, nested “Notifications class”
• For example: UIKeyboard.Notifications
• Pattern:
– Static method ObserveXXX
– Returns observer token
– Calling Dispose() on observer unregisters interest
Released
39. NSAttributedString
• On iOS 5:
– Introduced for use in CoreText
• On iOS 6:
– It became ubiquitous on UIKit
– UIKit views use it everywhere
• Cumbersome to create
Released
40. NSAttributedString
• Standard Objective-C esque approach:
//
// This example shows how to create an NSAttributedString for
// use with UIKit using NSDictionaries
//
var dict = new NSMutableDictionary () {
{ NSAttributedString.FontAttributeName,
UIFont.FromName ("HoeflerText-Regular", 24.0f), },
{ NSAttributedString.ForegroundColorAttributeName, UIColor.Black }
};
• Error prone:
– Get right values for keys
– Get right types for values
– Requires documentation trips
Released
41. NSAttributedString – C# 4 style
var text = new NSAttributedString (
"Hello, World",
font: UIFont.FromName ("HoeflerText-Regular", 24.0f),
foregroundColor: UIColor.Red);
• Uses C# named parameters
• Uses C# optional parameter processing
• Use as many (or few) as you want
Released
42. AudioToolbox, AudioUnit, CoreMidi
• Completed MIDI support
– Our CoreMIDI binding is OO, baked into system
– Equivalent to what 3rd party APIs people use
• AudioUnit
– Now complete supported (since 6.2)
– Full API coverage
• AudioToolbox
– Improved support for multiple audio channels
– Strongly typed APIs
Released
43. CFNetwork-powered HttpClient
• Use Apple’s CFNetwork for your HttpClient
– Avoid StartWWAN (Url call)
– Turns on Radio for you
– Integrates with Async
• Replace:
var client = new HttpClient ()
• With:
var client = new HttpClient (new CFNetworkHandler ())
Beta
44. New Dispose Semantics
• Changes in NSObject() Dispose
• If native code references object:
– Managed object is kept functional
– Actual shut down happens when native code
releases the reference.
• Allows Dispose() of objects that might still be
used by the system.
Released
45. Razor Integration
• Sometimes you want to generate HTML
• Razor offers a full template system
– Blend HTML and C#
– Code completion in HTML
• Easily pass parameters from C# to Template
Released
47. Razor
• Creating template, passing data:
– Model property, typed in cshtml file
var template = new HtmlReport () { Model = data };
• Run:
class HtmlReport {
string GenerateString ()
void Generate (TextWriter writer)
}
Released