Developing Apps for iOS: Your Guide to Objective-C
When it comes to developing software for iOS and Mac OS X, Objective-C is the primary programming language to use - Magora app developers know this for sure. Of course, you can use other languages and technologies like C++, PyObjC, pure C, MacRuby, MonoTouch or others to build iOS apps, but these are alternative variants that are mostly utilised for additional functionality or other secondary purposes, but we are going to tell about the language number one that you cannot do without when developing for iOS.
Do I Really Need to Learn Objective-C?
If you are totally satisfied by the functionality of web-based apps, you can skip learning Objective-C and getting familiar with the Cocoa Framework, actually, instead of reading this guide you should better find some tutorial on HTML-based app developing. On the other hand, if you want to build high-quality native apps for the iOS mobile operating system, Magora guide to Objective-C will help you with this perspective venture.
The Objective-C Programming Language
Objective-C is a general-purpose, object-oriented programming language that is basically an extension of the C programming language. It adds such features as Smalltalk-style messaging, multiple inheritance, runtime reflection and much more to C. It has a syntax that is very different from other languages, so if you are familiar with languages like Java or Ruby it may seem a bit strange to you at first glance. The fact that Objective-C is a superset of C gives an opportunity to go back to C whenever you wish when coding the iOS app. For instance, you can easily find primitive data types and native functions calls of C within iOS and Mac apps along with the code written in Objective-C.
Classes, Objects, and Methods of Objective-C
If you are not experienced in iOS app developing ot need to refresh your memory, Magora developers have prepared a brief tutorial on classes, objects and methods, explaining what they are and how they are used in Objective-C. Classes are blueprints that define sets of purposes and behaviours for the objects you want to create. Classes typically correspond to some concepts from the real world, for instance, a Plant.
Instances and Behaviours in iOS Development
A Plant class will most likely identify certain variables, for instance, the colour, the height and the species, as well as behaviour such as blooming, reproducing or photosynthesising. An object that belongs to a certain class is an instance of the class. Each instance has its own variables. For example, you can create 200 instances within the the Plant class and define different variables to each of them. Methods are behaviours of a class or of an instance within a class. They are accordingly called class methods and instance methods.
How to Create an Instance
To create a new instance of a class you need to allocate a block of memory for it on the help. The heap is the memory, that stores all the Objective-C objects and serves the purpose of dynamic allocation. All Objects in Objective-C are pointers to the heap, which is denoted by an asterisk. Let us show you an example of how to create an instance for the Plant class:
Plant *ourPlant = [[Plant alloc] init]
Reading the Objective-C for iOS Development
Now, let us make sure that you understand what it means. Do you know what the square brackets stand for? Be prepared to use them a lot in Objective-C because they enclose method calls. To the left you can see that we have created a new variable for the Plant* named ourPlant, then, to the right, we have done two method calls one within the other and defined what they return to ourPlant.
The Difference Between the Stack and the Heap
If you work with variables that have a certain size at the stage of compilation, they are stored on the stack. The stack provides storage for local data, which can be accessed without pointers. For example, the stack stores primitive data types such as (boolean, long, byte, char, short, int, etc.) because they all have pre-defined maximum size. The size of the objects in Objective-C is not restricted and can grow as much as you want, that is why they should be stored on the heap that enables to dynamically allocate their memory and use pointers. Pointers are memory addresses, and if you need to get an access to anything that the memory contains, you should dereference the pointer.
How to Do Method Calls in iOS
If you still do not clearly understand what is going on, let us take a closer look at the method calls. [Plant alloc] means that we are calling the class method +alloc on the Plant class. There is always a plus sign before a class method. It is used to return a generic object type of id. The usage of -init means that we are calling the instance method to initialise the memory in order to get access to use the new object. The indicator of instance methods is a minus sign that precedes it. You cannot use Objective-C objects without performing these two actions.
Working with object, you should always keep in mind that if you allocate a certain amount of memory, you should not forget to inform the runtime when the object is done being used and can be released. Objective-C uses a reference-counting system to track where each object is used at the moment, because one object can be used by different elements of the iOS app at once. When you create an object, it has only one reference. When a certain part of the iOS app is done using the object, it sends a -release message to the object, which results in the number of its references being decreased by one. The memory is freed when there are no references left to an object.
Ensuring the iOS App’s Stability
If you forget to release the memory of the object when they are no longer used, it may result in iOS app crashes and bad performance because the program will be using too much resources. In the case of Mac apps it will not only result in crashes but will also slow down the entire system, taking more and more memory. Without a doubt, you have experienced such problems, having left a Safari browser for a couple of days or a game running in the background. It happens because the iOS app uses exponentially more memory and leaves almost no resources to run other programs fast. Memory is one of the most important resources for iOS app developers, so use it wisely. Apple's Memory Management Guide is a great material that will help you get a deeper understanding of memory management in Cocoa.
Despite having behaviours, objects also can store data. For instance, we have a Smartphone object - what types of data attributes can it possess?
- Model name
- Operating system
Now, we need to look into these attributes. The first one is the model name. It could be presented by a combination of numbers, for example, 1900738. The data type of this attribute is a number. There are different ways to represent a number in objective-C:
- As the NSNumber class instance
- As a primitive int
- As a NSInteger data type used in Foundation
How to Represent a Number in an iOS App Written in Objective-C
As you see, you have at least three choices. Now we will explain what they mean. The first options is the NSNumber class that is defined in the Foundation framework. The int variable type is a primitive data type from C that contains a number with a maximum value. And the third way is a primitive data type NSInteger that also comes from the Foundation framework and its size adjusts to the needs of the iOS program at the given moment. Foundation is one of the Apple’s frameworks for developing iOS apps.
Learning the Details
You do not need to allocate memory for NSInteger or int because they are not objects, which means that their size is already defined. But you still need a pointer to get access to their content because they are created on the stack instead of the heap. Such elements as NSInteger, CGRect, CGSize, CGPoint and man other things stated in the Foundation Data Types Reference are not object as well, so they do not need a pointer in the shape of the asteriks too.
Convenient Class Methods
Let us get back to the first case of storing the model number 1900738 as an NSNumber object. When we create it, it will look like this:
NSNumber *model = [NSNumber numberWithInt:1900738 ]
But if it is an instance of the NSNumber class, then why there is no -int? Whi there is no +alloc? You do not need to set the memory and returned it with this objects because they have convenient class methods that do it automatically.
Developing Apps for iOS with Professionals
We create high-quality iOS apps that stand out from the crowd thanks to their amazing designs, feature-rich functionality, and outstanding user experience. Magora developers are dedicated to our craft and over the years have delivered hundreds of successful B2C iOS programs, bespoke enterprise systems, MVPs for startups and beautiful websites across various industries. At Magora, the cornerstones of our culture are seamless communication with the clients, full transparency of the process and strong team collaboration. Get in touch to discuss your ideas - we will be happy to hear you over the phone, read your email letter or see you at our London headquarters.