34,333
edits
Changes
New page: In this chapter of Objective-C 2.0 Essentials we will continue looking at flow control in Objective-C applications. In the preceding chapters we have looked in detail at using logical ...
In this chapter of [[Objective-C 2.0 Essentials]] we will continue looking at flow control in Objective-C applications. In the preceding chapters we have looked in detail at using logical expressions to decide what code should be executed. Another aspect of flow control entails the definition of loops. Loops are essentially sequences of Objective-C statements which are to be executed repeatedly until a specified condition (or conditions) are met.
== Why Use Loops? ==
It is generally common knowledge that computers are great at performing repetitive tasks an infinite number of times, and doing so very quickly. It is also common knowledge that computers really don't do anything unless someone programs them to tell them what to do. Loop statements are the primary mechanism for telling a computer that a sequence of tasks needs to be repeated a specific number of times. Suppose, for example, that you have a requirement to add a number to itself ten times. One way to do this might be to write the following Objective-C code:
<pre>
int j = 10;
j += j;
j += j;
j += j;
j += j;
j += j;
j += j;
j += j;
j += j;
j += j;
j += j;
</pre>
Whilst this is somewhat cumbersome it does work. What would happen, however, if you needed to perform this task 100 or even 10,000 times? Writing Objective-C code to perform this as above would be prohibitive. Such a scenario is exactly what the ''for'' loop is intended to handle.
The syntax of an Objective-C ''for loop'' is as follows:
<pre>
for ( ''initializer''; ''conditional expression''; ''loop expression'' )
{
// statements to be executed
}
</pre>
<google>ADSDAQBOX_FLOW</google>
The ''initializer'' typically initializes a counter variable. Traditionally the variable ''i'' is used for this purpose. For example:
i = 0;
This sets the counter to be the variable ''i'' and sets it to zero.
The ''conditional expression'' specifies the test to perform to verify whether the loop has been performed the required number of iterations. For example, if we want to loop 100 times:
i < 100;
Finally the ''loop expression'' specifies the action to perform on the counter variable. For example to increment by 1:
i++;
The body of statements to be executed on each iteration of the loop are contained within the code block defined by the opening ({) and closing (}) braces.
Bringing this all together we can create a ''for'' loop to perform the task outlined in the earlier example:
<pre>
int j = 10;
for (int i=0; i<100; i++)
{
j += j;
}
NSLog (@"j = %i", j);
</pre>
== Objective-C Loop Variable Scope ==
A key point to note in creating loops is that any variables defined within the body of a loop are only visible to code within the loop. This is concept known as ''scope''. If, for example, a variable ''myCounter'' is defined in a ''for'' loop, that variable ceases to exist once the loop terminates:
<pre>
// variable myCounter does not yet exist
for (int i = 0; i < 10; i++)
{
int myCounter = 0; //myCounter variable created in scope of for loop
myCounter += i;
}
// after loop exit variable myCounter is now out of scope and ceases to exist
</pre>
== Creating an Infinite for Loop ==
A for loop that will execute an infinite number of times may be constructed using ''for (;;)'' syntax. For example, the following code sample will output ''Hello from Objective-C'' until the program is manually terminated by the user (or the computer is turned off or rebooted):
<pre>
for (;;)
{
NSLog (@"Hello from Objective-C");
}
</pre>
== Breaking Out of a for Loop ==
Having created a loop it is possible that under certain conditions you might want to break out of the loop before the completion criteria have been met (particularly if you have created an infinite loop). One such example might involve continually checking for activity on a network socket. Once activity has been detected it will be necessary to break out of the monitoring loop and perform some other task.
For the purpose of breaking out of a loop C# provides the ''break'' statement which breaks out of the current loop and resumes execution at the code directly after the loop. For example:
<pre>
int j = 10;
int i;
for (i = 0; i < 100; i++)
{
j += j;
if (j > 100)
break;
NSLog (@"j = %i", j);
}
</pre>
In the above example the loop will continue to execute until the value of j exceeds 100 at which point the loop will exit.
== Nested for Loops ==
So far we have looked at only a single level of ''for'' loop. It is also possible to nest for loops where one for loop resides inside another for loop. For example:
<pre>
int j;
int i;
for (i = 0; i < 100; i++)
{
NSLog( @"i = %i", i);
for (j = 0; j < 10; j++)
{
NSLog ( @"j = %i", j);
}
}
</pre>
The above example will loop 100 times displaying the value of i on each iteration. In addition, for each of those iterations it will loop 10 times displaying the value of j.
== Breaking From Nested Loops ==
An important point to be aware of when breaking out of a nested for loop is that the break only exits from the current level of loop. For example, the following Objective-C code example will exit from the current iteration of the nested loop when j is equal to 5. The outer loop will, however, continue to iterate and, in turn execute the nested loop:
<pre>
for (i = 0; i < 100; i++)
{
NSLog( @"i = %i", i);
for (j = 0; j < 10; j++)
{
if (j == 5)
break;
NSLog ( @"j = %i", j);
}
}
</pre>
== Continuing for Loops ==
Another useful statement for use in loops in the ''continue'' statement. When the execution process finds a ''continue'' statement in any kind of loop it skips all remaining code in the body of the loop and begins execution once again from the top of the loop. Using this technique we can construct a ''for'' loop which outputs only even numbers between 1 and 9:
<pre>
int j;
int i;
for (i = 1; i < 10; i++)
{
if ((i % 2) != 0)
continue;
NSLog( @"i = %i", i);
}
</pre>
In the example, if i is not divisible by 2 with 0 remaining the code performs a ''continue'' sending execution to the top of the ''for'' loop, thereby bypassing the code to output the value of i. This will result in the following output:
<pre>
2
4
6
8
</pre>
== Why Use Loops? ==
It is generally common knowledge that computers are great at performing repetitive tasks an infinite number of times, and doing so very quickly. It is also common knowledge that computers really don't do anything unless someone programs them to tell them what to do. Loop statements are the primary mechanism for telling a computer that a sequence of tasks needs to be repeated a specific number of times. Suppose, for example, that you have a requirement to add a number to itself ten times. One way to do this might be to write the following Objective-C code:
<pre>
int j = 10;
j += j;
j += j;
j += j;
j += j;
j += j;
j += j;
j += j;
j += j;
j += j;
j += j;
</pre>
Whilst this is somewhat cumbersome it does work. What would happen, however, if you needed to perform this task 100 or even 10,000 times? Writing Objective-C code to perform this as above would be prohibitive. Such a scenario is exactly what the ''for'' loop is intended to handle.
The syntax of an Objective-C ''for loop'' is as follows:
<pre>
for ( ''initializer''; ''conditional expression''; ''loop expression'' )
{
// statements to be executed
}
</pre>
<google>ADSDAQBOX_FLOW</google>
The ''initializer'' typically initializes a counter variable. Traditionally the variable ''i'' is used for this purpose. For example:
i = 0;
This sets the counter to be the variable ''i'' and sets it to zero.
The ''conditional expression'' specifies the test to perform to verify whether the loop has been performed the required number of iterations. For example, if we want to loop 100 times:
i < 100;
Finally the ''loop expression'' specifies the action to perform on the counter variable. For example to increment by 1:
i++;
The body of statements to be executed on each iteration of the loop are contained within the code block defined by the opening ({) and closing (}) braces.
Bringing this all together we can create a ''for'' loop to perform the task outlined in the earlier example:
<pre>
int j = 10;
for (int i=0; i<100; i++)
{
j += j;
}
NSLog (@"j = %i", j);
</pre>
== Objective-C Loop Variable Scope ==
A key point to note in creating loops is that any variables defined within the body of a loop are only visible to code within the loop. This is concept known as ''scope''. If, for example, a variable ''myCounter'' is defined in a ''for'' loop, that variable ceases to exist once the loop terminates:
<pre>
// variable myCounter does not yet exist
for (int i = 0; i < 10; i++)
{
int myCounter = 0; //myCounter variable created in scope of for loop
myCounter += i;
}
// after loop exit variable myCounter is now out of scope and ceases to exist
</pre>
== Creating an Infinite for Loop ==
A for loop that will execute an infinite number of times may be constructed using ''for (;;)'' syntax. For example, the following code sample will output ''Hello from Objective-C'' until the program is manually terminated by the user (or the computer is turned off or rebooted):
<pre>
for (;;)
{
NSLog (@"Hello from Objective-C");
}
</pre>
== Breaking Out of a for Loop ==
Having created a loop it is possible that under certain conditions you might want to break out of the loop before the completion criteria have been met (particularly if you have created an infinite loop). One such example might involve continually checking for activity on a network socket. Once activity has been detected it will be necessary to break out of the monitoring loop and perform some other task.
For the purpose of breaking out of a loop C# provides the ''break'' statement which breaks out of the current loop and resumes execution at the code directly after the loop. For example:
<pre>
int j = 10;
int i;
for (i = 0; i < 100; i++)
{
j += j;
if (j > 100)
break;
NSLog (@"j = %i", j);
}
</pre>
In the above example the loop will continue to execute until the value of j exceeds 100 at which point the loop will exit.
== Nested for Loops ==
So far we have looked at only a single level of ''for'' loop. It is also possible to nest for loops where one for loop resides inside another for loop. For example:
<pre>
int j;
int i;
for (i = 0; i < 100; i++)
{
NSLog( @"i = %i", i);
for (j = 0; j < 10; j++)
{
NSLog ( @"j = %i", j);
}
}
</pre>
The above example will loop 100 times displaying the value of i on each iteration. In addition, for each of those iterations it will loop 10 times displaying the value of j.
== Breaking From Nested Loops ==
An important point to be aware of when breaking out of a nested for loop is that the break only exits from the current level of loop. For example, the following Objective-C code example will exit from the current iteration of the nested loop when j is equal to 5. The outer loop will, however, continue to iterate and, in turn execute the nested loop:
<pre>
for (i = 0; i < 100; i++)
{
NSLog( @"i = %i", i);
for (j = 0; j < 10; j++)
{
if (j == 5)
break;
NSLog ( @"j = %i", j);
}
}
</pre>
== Continuing for Loops ==
Another useful statement for use in loops in the ''continue'' statement. When the execution process finds a ''continue'' statement in any kind of loop it skips all remaining code in the body of the loop and begins execution once again from the top of the loop. Using this technique we can construct a ''for'' loop which outputs only even numbers between 1 and 9:
<pre>
int j;
int i;
for (i = 1; i < 10; i++)
{
if ((i % 2) != 0)
continue;
NSLog( @"i = %i", i);
}
</pre>
In the example, if i is not divisible by 2 with 0 remaining the code performs a ''continue'' sending execution to the top of the ''for'' loop, thereby bypassing the code to output the value of i. This will result in the following output:
<pre>
2
4
6
8
</pre>