Objective-C

iOS for C# Developer – part 4: Xcode

This post is part of the series: iOS for C# Developer. Previous parts:

C# developers works with Visual Studio. Recently, some are trying to switch to SublimeText. However, I will assume that you, as C# Developer are familiar with VS. To write iOS applications, you need Xcode. I haven’t heard about nobody who created an working app in a different editor (more advanced than Hello World).

In this post I would like to provide a few tips that will help you to get started and be productive.

The first thing that is worth to mention is the fact that Xcode is free. You cannot test you apps on the iPhone or iPad before you pay $99 though. You need to be satisfied with simulator.

Key shortcuts

For the beginning, remember three:

  • ⇧ + ⌘ + O – quick open (equivalent to CTRL+, in VS2013 or CTRL+T in ReSharper)
  • ⌥ + click – jump to documentation (when clicked on class/interface)
  • ⌘ + L – jump to specified line of code

This three will definitely help you to get productive at the beginning. You can find more in this cheat-sheet.

Debugging

In order to debug application in VS, you have to run it in debug mode. In Xcode, when you run the app on emulator it is always in debug mode. Thus, you just need to set the break-point (by mouse click on the line number, like in VS, or by ⌘ + \ shortcut) and run the app (⌘ + R). Once break-point is reached you can step over (F6), step into (F7) or step out (F8).

Very useful during debugging is dumping objects into console with NSLog function:

NSLog(jsonString);

This outputs, e.g., JSON string to the console, which allows you to inspect it.

To get more flavor of debugging, check Apple documentation and Brian Moakley’s blog post.

Playgrounds

The latest version of Xcode (v6), which introduce support for Swift language, adds also very handy feature: Playgrounds. It allows you write and test simple Swift programs, without using iOS emulator. Playgrounds are useful especially, when you are testing some complex logic. They are very powerful. You can use them even to test drawing (still without running iOS emulator). To see it in action, check this demo.

Summary

Xcode is very nice IDE. Works very smooth, and breaks very rarely. I wish there was more code snippets (like it is in Visual Studio, especially with ReSharper or WebEssentials). Xcode could also adapt rich debugging experience from VS (e.g., inspecting object variable after moving mouse pointer in top of them). I find it hard to work with this IDE on small screen (like MacBook display). To get comfortable, I need at least 22-24″. But that is just my opinion. What do you think?


iOS for C# Developer – part 3: multithreading

This post is part of the series: iOS for C# Developer. Previous parts:

The most typical scenario to use multithreading is to maintain responsive UI when we do some resource-consuming computation.

C#

Let’s consider simple button click action in C#:

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.status.Content = "Computing...";
    Compute();
    this.status.Content = "Done";
}

private void Compute()
{
    Thread.Sleep(5000);            
}

Method Compute() is a CPU-intensive operation (simulated by Sleep() function).

Above code will block UI during computation. To keep UI responsive, computation has to take place in a separate thread. It can be done easily using async/await keywords:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    this.status.Content = "Computing...";
    await Compute();
    this.status.Content = "Done";
}

private async Task Compute()
{
    await Task.Factory.StartNew(() =>
    {
        Thread.Sleep(5000);
    });
}

iOS

This is equivalent (single-threaded) button click handler in iOS:

- (IBAction)buttonClick:(id)sender
{
    self.status.text = @"Computing...";
    [self compute];
    self.status.text = @"Done";
}

- (void)compute
{
    [NSThread sleepForTimeInterval:5];
}

Multithreaded version is a little bit different. In Objective-C, there is no syntax similar to async/await. Thus, status update has to be invoked by background thread explicitly. Additionally, every UI operation (in this case: label text update) has to be done in the main thread. Below code, use Dispatch Queues, which is the easiest and recommended way for multithreading scenarios:

- (IBAction)buttonClick:(id)sender
{
    self.status.text = @"Computing...";
    [self compute];
}

- (void)compute
{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.status.text = @"Done";
        });
    });
}

This multithreaded code will look pretty similar in Swift.

Summary

Invoking background threads is much easier from developer perspective in C#. Code is concise and more readable. Multithreading in Objective-C introduce some overhead, but it is not very hard to handle.


iOS for C# Developer – part 2: strings

This post is part of the series: iOS for C# Developer. First part can be found here.

String operations in Objective-C are very verbose in comparison to C#.

Let’s assume the following string definition for all below examples:

NSString *str = @"Some string. Another string.";

Concatenation

I think this is the most common operation. In C# it is very simple:

string result += " Appended string.";

* For concatenation in C#, consider using StringBuilder class (if performance matters).

In Objective-C, NSMutableString type has to be used. Thus, if we have NSString created, we have to do the following:

NSMutableString *temp = [[NSMutableString alloc] initWithString:str];
[temp stringByAppendingString:@" Appended string."];
str = temp;

A bit of work, huh?

Substring

To get substring from letter 3 to 7 in C#:

string result = str.Substring(3,5);

In Objective-C:

NSString *result = [str substringWithRange:NSMakeRange(3,5)];

Pretty straightforward.

Split

To split sentences in our sample string in C#, we would do:

string[] result = str.Split(". ");

In Objective-C:

NSArray *result = [str componentsSeparatedByString:@". "];

Also, pretty similar.

Replace

This operation is much more verbose than its equivalent in C#. To replace spaces with underscores, in C# we do:

string result = str.Replace(" ", "_");

In Objective-C:

NSString *result = [str stringByReplacingOccurrencesOfString:@" " withString:@"_"];

Looks pretty the same, but long, custom names preceding actual parameters make code unnecessary long (IMO).

Real-world example

Usually we need a few string operations working together. Let’s apply above operations together. For example: we want to get only the second sentence from our string with underscores instead of spaces.

In C#:

string result = str.Split(new [] {". "}, StringSplitOptions.RemoveEmptyEntries)[1].Replace(' ','_');

In Objective-C:

NSString *result = [[str componentsSeparatedByString:@". "][1] stringByReplacingOccurrencesOfString:@" " withString:@"_"];

Summary

Some of above operations are easier in Swift (e.g., concatenation looks the same like in C#), but some are still very verbose (e.g., substring, replace). However, the syntax is more similar to C#. The message passing syntax is something you need to get use to in Objective-C, not only in case of string operations.


iOS for C# Developer – part 1: Classes and creating objects

In this series I would like to present an overview of differences and similarities in developing iOS and C# apps.

First part is about Object-Oriented features. If you are C# developer and you are starting with Objective-C, Object-Oriented terminology might be confusing.

Interface

In Objective-C, interface is a class declaration (not existing in C#). It is like header file in C++. It has even the same extension: .h. This is sample interface:

@interface Example

+ (void)someStaticMethod;

- (NSInteger)someInstanceMethod:(BOOL)param1 calledWith:(NSInteger)num;

@end

Static (class) methods are distinguished by + sign. Instance method starts with - sign. Return types are in brackets. Parameters (brackets and name) are preceded by custom name. In class implementation only parameter name matters.

Implementation

In addition to interface (equivalent of class declaration), Objective-C classes have also implementation files with .m extension (equivalent of .cpp files in C++). Example implementation for previous interface (class declaration) can look like that:

@implementation Example

+ (void)someStaticMethod
{
  // implementation
}

- (NSInteger)someInstanceMethod:(BOOL)param1 calledWith:(NSInteger)num
{
  if(param1) {
    return num*2;
  } else {
    return num;
  }
}

@end

Protocols

Protocol is equivalent of interface in C#. This is sample protocol definition:

@protocol SampleProtocol
- (void)protocolMethod1;
- (void)protocolMethod2;
@end

To take advantage of this protocol in some class, it has to be stated in the interface, in which this protocol is being used:

@interface Example : NSObject 
+ (void)someStaticMethod;
- (NSInteger)someInstanceMethod:(BOOL)param1 calledWith:(NSInteger)num;
@end

Then, its methods have to be implemented in the implementation file:

@implementation Example 

+ (void)someStaticMethod 
{ 
  // implementation 
} 

- (NSInteger)someInstanceMethod:(BOOL)param1 calledWith:(NSInteger)num 
{ 
  if(param1) { 
    return num*2; 
  } else { 
    return num; 
  } 
} 

- (void)protocolMethod1 
{ 
  // implementation 
} 

- (void)protocolMethod2 
{ 
  // implementation 
} 

@end

There are two types of methods in protocol:

  • required (default)
  • optional

In previous protocol, both methods are required, because it is a default mode. This means, both has to be implemented in the class that use the protocol. In order to make second method optional, keyword @optional has to be used:

@protocol SampleProtocol

- (void)protocolMethod1;

@optional
- (void)protocolMethod2;

@end

All methods declared after @optional keyword are optional. In order to declare required method after that, @required keyword has to be used:

@protocol SampleProtocol

- (void)protocolMethod1;  // required method

@optional
- (void)protocolMethod2;  // optional method
- (void)protocolMethod3;  // optional method

@required
- (void)protocolMethod4;  // required method

@end

Instantiating objects

Creating instance of object has two steps: allocation and initialization. To create instance of Example class defined above, message passing syntax is used:

Example *obj = [[Example alloc] init];

Shortcut for above object creation:

Example *obj = [Example new];

When the class has a constructor with parameters, e.g.:

@interface Example : NSObject {
  NSInteger *sampleProperty;
}
- (id) initWithParam:param;
@end

@implementation Example

- (id) initWithParam:(NSInteger)param
{
  self = [super init];
  if (self) {
    self.sampleProperty = param;
  }
  return self;
}

@end

Initialization looks as follows:

Example *obj = [Example initWithParam:25];

Summary

  • Interface – class declaration
  • Implementation – class body (implementation of declared methods in class interface)
  • Protocol – the same construct as interface in C#
  • Object creation: Example *obj = [[Example alloc] init];

How top 10 programming languages work

TIOBE index: July 2014

I am programming for more than 10 years. I realized that, when I found my first, personal home page (written in PHP) on my hard drive. Some files have last modification date: May 2003. Since that time I was working (or playing) with 9 of top 10 programming language from TIOBE Index list. As I mentioned, I started with PHP, then I learnt a little bit JavaScript (to create fancy menus or ‘secret pages’ on my website). In high school I started learning C++. At the University I learnt C, more C++ and Java. Then I learnt C# on my own, and it is still my favorite language. Along with C# I learnt ASP.NET and T-SQL (to be able to create websites with databases). I also learnt Python and Objective-C. Former became useful when I started my Research Assistant Job.

More experience I gain, more interested I am in how things work underneath the code level. In this post I want to provide short description of the Top 10 programming languages (by TIOBE Index), how they work and their super short history.

PHP

Interpreted language created by Rasmus Lerdorf. Originally, collection of Perl scripts, rewritten to C for performance reasons, ability to work with web-forms and communicate with databases. Most popular interpreter: Zend Engine. Since PHP 4, the PHP parser compiles input to produce bytecode for processing by the Zend Engine. Facebook developed two PHP interpreters: HipHop (transforms the PHP scripts into C++ code and then compiles) and HipHop Virtual Machine (converts PHP into a high-level bytecode, which is then translated into x86-64 machine code dynamically). Recommended book: PHP and MySQL Web Development.

JavaScript

Dynamic, interpreted and prototype-based language. JavaScript is superset of ECMAScript standard. Usually used as part of web browser, but also in server-side (Node.js) or even for desktop and mobile application development. Current browsers perform just-in-time compilation. There are many JavaScript engines (interpreters): Rhino (written in Java), SpiderMonkey (written in C, first JS engine), V8 (written C++, by Google, used in Google Chrome), Chakra (performs JIT compilation on a separate CPU core, parallel to the web browser; created by Microsoft, used in Internet Explorer) etc. Recommended book: JavaScript: The Good Parts.

C/C++

C is compiled, static type language created by Denis Ritchie. It influenced many other languages, e.g.: C++, C#, Java, JavaScript, Objective-C, Perl, PHP, Python, and even Unix’s C Shell. C++ is nearly a superset of C, with object oriented features inspired by Simula language, created by Bjarne Stroustrup. C and C++ are compiled to machine specific code, thus platform specific compiler is needed. Most popular compilers: GCC and Visual C++. C++ evolve, Modern C++ (currently C++ 11 and vNext: C++ 14) introduces: smart pointers, for each (range for), lambda functions and much more. Recommended book: Ivor Horton’s Beginning Visual C++ 2012The C Programming Language (by Brian Kernighan and Denis Ritchie)  used to be one of the most popular programming books ever.

Java

C-based language created by James Gosling, which introduces automatic memory management by Garbage Collector. Java is compiled to bytecode (.class files), which runs on JVM (Java Virtual Machine). Its main design goal is “Write Once, Run Anywhere” (WORA). The same code can be compiled to the same bytecode on different machines. Then JVM (platform-specific) translates bytecode to particular machine code during run-time (Just-in-Time (JIT) compilation). Java applets can run in web browser. My personal recommendation for Java book is Hortsmann’s Core Java Volume I – Fundamentals and Volume II – Advanced Features. Well known Java book is Bruce Eckel’s Thinking in Java.

C#

C# is Microsoft’s version of Java language created by Anders Hejlsberg. However, C# is closer to C++ in case of design and syntax. It is compiled to Intermediate Language (equivalent of bytecode in Java) and runs on Common Language Runtime (equivalent of JVM). C# also uses Garbage Collector. It has many features not existing in Java like rich native interoperability, query language (LINQ) or dynamic type. For more, check Comparison of C# and Java. Book for quick start: Sams Teach Yourself Visual C# 2010 in 24 Hours recommended by Eric Lippert (former developer of C# compiler). To dive in, check: C# 5.0 in a Nutshell: The Definitive Reference by Joseph Albahari and Ben Albahari, C# in Depth by Jon Skeet and CLR via C# by Jeffrey Richter.

Python

Dynamic, interpreted language, created by Guido van Rossum. Most popular implementation: CPython (implemented in C). It compiles Python programs to intermediate code (.pyc files) and runs them on Virtual Machine. There are many other implementations, e.g. Jython, which compiles Python to Java Bytecode (.class files). Python is much more expressive language than C or Java. Some constructs, which needs 10 lines of C code or 3 lines of Java code, requires only 1 line in Python (check reverse words example in my post about Python). Python uses whitespace indentation, rather than curly braces or keywords, to delimit blocks. To get started I recommend Google’s Python Class (videos section) created by Nick Parlante. Other resources: Python tutorial and Dive into Python. You can also check my post Python jump start for more details.

Objective-C

Strict superset of C language with object-oriented capabilities inspired by Smalltalk. Every C program can be compiled by Objective-C compiler, C code can be included within Objective-C code. Most popular compilers: Clang and LLVM. Instead of calling methods (like in C++: obj->method(param)), messages to objects are being sent ([obj method:param]) and resolved at runtime (not at compile time like in C++). There is no Garbage Collector (which works at run-time) in Objective-C, but instead Automatic Reference Counting (compile-time feature) is used. Objective-C is the main programming language used by Apple for the OS X and iOS. However, in this year Apple announced plans to replace Objective-C with new Swift language. Resources to learn Objective-C can be found in my other post.

Transact-SQL

Declarative language for managing data held in a relational database management system (RDBMS). Created by Microsoft (for MS SQL Sever), T-SQL is an extension to SQL, which makes it Turing complete. It adds to SQL: procedural programming, local variables, functions for string and date processing, mathematics etc. and allows FROM clause in DELETE and UPDATE statements (which allows joins to be included). T-SQL (and SQL) query differs from program in such a way that they just tell what to do, not how to do that. Figuring out how to execute query is a role of query analyzer. Check Understanding how SQL Server executes a query.  To learn T-SQL, you should learn SQL first. Recommended tutorial: T-SQL Step by Step Course (video tutorial). Recommended books: Itzik Ben-Gan’s Microsoft SQL Server 2012 T-SQL Fundamentals and other his books.

(Visual) Basic (.NET)

Compiled language created by Microsoft. Compiles to native language or P-Code and uses the Microsoft C++ compiler to generate the executable. It derives from BASIC. Similar to Python: tabs and new lines are used to delimit blocks. VB (under Visual Studio) allows to create GUI using drag-and-drop technique. Last version (VB6) was released in 1998 and is abandoned in favor of VB.NET, which introduces many features (present also in C#), but still supported, even on Windows 8. Check Comparison of VB and VB.NET. Both (VB.NET and C#) run on the same run time (CLR). More details can be found here. Recommended tutorials to get started: Visual Basic Fundamentals: Development for Absolute Beginners by Bob Tabor and Visual Basic .NET Tutorials. Good reference is Visual Basic at Wikibooks. To get VB syntax highlighting in SublimeText, this package works.

Summary

I read about all 10 languages in Wikipedia before writing this post. I was surprised how much I could learn in 5-10 minutes reading. I don’t know why, but I feel much better now, when I refreshed and organized my knowledge. If you want to start learning about new programming language, I recommend you to read about it on Wikipedia first. Even more, read about all languages you are using now on Wikipedia as well. It gives you great, high-level overview. Now, Wikipedia will be my start point of research about “some new thing”.