My Blog List

Tuesday, November 16, 2010

Over the Edge of Time: Accessing Nil!

    
OR

Why you never want to complain about waiting in the airport 
while they do a
little maintenance

The Well-Behaved Version

There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".tty /dev/ttys000
Loading program into debugger…
Program loaded.
run
[Switching to process 31280]
Portal Pilots Maintenance Flight. Scanning for UNIQUE Time Portals
portals[0] = bridge
portals[1] = creek
portals[2] = path
portals[3] = alley
Running…

Debugger stopped.
Program exited with status value:0.

But Wait!

HERE’S WHAT HAPPENS WHEN THE ARCH-ENEMY OF PORTAL PILOTS MANAGES TO GET HIRED ONTO THE DEVELOPMENT STAFF


(just tought I'd try to access nil and see where it took me!)

// If I ever want to totally gum up the works, I'll make sure to try to access past the end of the array!


Portal Pilots Maintenance Flight. Scanning for UNIQUE Time Portals
portals[0] = bridge
portals[1] = creek
portals[2] = path
portals[3] = alley
2010-11-16 12:14:54.431 encounterPortals[31239:a0f] *** __NSAutoreleaseNoPool(): Object 0x10010cce0 of class NSCFString autoreleased with no pool in place - just leaking
2010-11-16 12:14:54.433 encounterPortals[31239:a0f] *** __NSAutoreleaseNoPool(): Object 0x1001107d0 of class NSCFString autoreleased with no pool in place - just leaking
2010-11-16 12:14:54.433 encounterPortals[31239:a0f] *** __NSAutoreleaseNoPool(): Object 0x1001023b0 of class NSException autoreleased with no pool in place - just leaking
2010-11-16 12:14:54.434 encounterPortals[31239:a0f] *** __NSAutoreleaseNoPool(): Object 0x1001108e0 of class _NSCallStackArray autoreleased with no pool in place - just leaking
2010-11-16 12:14:54.434 encounterPortals[31239:a0f] *** __NSAutoreleaseNoPool(): Object 0x100110a90 of class _NSCallStackArray autoreleased with no pool in place - just leaking
2010-11-16 12:14:54.448 encounterPortals[31239:a0f] *** __NSAutoreleaseNoPool(): Object 0x100110e30 of class NSCFString autoreleased with no pool in place - just leaking
2010-11-16 12:14:54.495 encounterPortals[31239:a0f] *** __NSAutoreleaseNoPool(): Object 0x100111440 of class NSCFString autoreleased with no pool in place - just leaking
2010-11-16 12:14:54.496 encounterPortals[31239:a0f] *** __NSAutoreleaseNoPool(): Object 0x100111890 of class NSConcreteMutableData autoreleased with no pool in place - just leaking
2010-11-16 12:14:54.497 encounterPortals[31239:a0f] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (4) beyond bounds (4)'
*** Call stack at first throw:
(
       0   CoreFoundation                      0x00007fff884d8cc4 __exceptionPreprocess + 180
       1   libobjc.A.dylib                     0x00007fff86f250f3 objc_exception_throw + 45
       2   CoreFoundation                      0x00007fff884d8ae7 +[NSException raise:format:arguments:] + 103
       3   CoreFoundation                      0x00007fff884d8a74 +[NSException raise:format:] + 148
       4   Foundation                          0x00007fff801db084 _NSArrayRaiseBoundException + 122
       5   Foundation                          0x00007fff8013db59 -[NSCFArray objectAtIndex:] + 75
       6   encounterPortals                    0x0000000100000dfd main + 417
       7   encounterPortals                    0x0000000100000c54 start + 52
       8   ???                                 0x0000000000000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.
sharedlibrary apply-load-rules all
kill
quit


// encounterPortals
// PortalPilots encounter a variety of Time Portal Types
// based on accesselements page 166, Holzner

#import <Foundation/Foundation.h>

// IMPORTANT STUFF
//  1) End arrays with the nil object
//  2) Use @ to differentiat OBJECTIVE C strings from C-style strings

int main (int argc, const char * argv[]) {
    NSArray *portals = [[NSArray alloc] initWithObjects:@"bridge", @"creek",@"path", @"alley", nil];
    printf("Portal Pilots Maintenance Flight. Scanning for UNIQUE Time Portals \n");
    printf("portals[0] = %s \n", [[portals objectAtIndex: 0] cString]);
     printf("portals[1] = %s \n", [[portals objectAtIndex: 1] cString]);
    printf("portals[2] = %s \n", [[portals objectAtIndex: 2] cString]);
     printf("portals[3] = %s \n", [[portals objectAtIndex: 3] cString]);
   
    // Thought it would be interesting to try to access nil
    // Wow! Leaking - What IS leaking? And all kinds of neat errors
  
    //printf("portals[4] = %s \n", [[portals objectAtIndex: 4] cString]);

    return 0;
}

Time Travel Protocols


Loading program into debugger…
Program loaded.
run
[Switching to process 30368]
Running…
Encountered a Time Portal, type Creek
Encountered a Time Portal, type Alley

Debugger stopped.
Program exited with status value:0.

//
//  TimeTravelProtocol.m

//  Based on page 161 Holzner Quick Start Book

//  Created by xxxxx on 11/11/10.
//  Copyright 2010 __xxx__. All rights reserved.
//

// page 155 The Point of using Protocols
// Protocols let me specifiy a method or methods that can be used in multiple classes.
//   Protocols let me declare methods and to define the implementation in the class
//        Protocols let me make sure
//    that all my derived classes implement the same methods - though the implementation may be different

// In this project I create a 'printing' protocol, which I can include in the interface files of other classes
//     it ADDS 'print' to their interfaces
//  I can implement the print method a different way for each class


// NOTE IMPORTANT: IN PREVIOUS EXAMPLES I would have included the
//          (void) print;
//   in the .h files associated with each class alley.h and creek.h) - but now this is only in printing. h
//  So I can be sure that my derived classes will inherit this method from their base classes

// Apparently this is how Objective-C fakes out multiple inheritance too - but I don't know exactly how to make that
//   happen yet from multiple parents at the same level....


// Another way  this book does something like this, is with prototypes
//     that is BEFORE it moved onto object-oriented methods
//   and is back on page 63 'a function prototype is also called a function declaration,
//       as opposed to a definition, which includes the body of the function


#import <stdio.h>
#import "Creek.h";
#import "Alley.h";

int main(void) {
   
    Creek *c = [Creek new];
    [c print];
   
    Alley *c2 = [Alley new];
    [c2 print];
   
    return 0;
}

Thursday, November 11, 2010

Debugging: Hey bobcat, to catch a fish, you gotta think like a fish


 
There was a kid’s book I had, when I still was a kid, about a native American child. Her elders told her that to catch a fish, she had to think like a fish. Or maybe it was bear, or a mountain goat. I don’t actually remember. So Little Bobcat developed her analytical little wits and finally caught herself a fish.

There’s a lot I have yet to learn about the XCODE debugger. In fact, just about everything.  I haven’t even figured out where to go to learn about how the debugger works. I’m still just looking at error messages and going from there. Tonight I had ‘duplicate symbol _main’. I clicked on every highlighted place I could find. I looked at the thread displaying the hierarchy of file names. I looked through each of the five files I’d created, but I only found the word ‘main’ in one place. * Finally I just decided to think like a fish.

Somewhere, I must have more than one of those lines that looks like this

int main(void) {

but I sure didn’t see it in any of my ‘.m’ or ‘.h’ files.

So I started opening up gates. That’s what a fish would do, right? A fish like XCODE looks at all the files in the project. (One heck of a smart fish) and that fish recognizes the name of the project. So the fact that I was expecting my fish to only respond to the lines  (my fishing line that is) in a file called ‘main.m’, didn’t mean that she wasn’t going to look around for other files. Particularly a file with the same name as my project – ‘protocols.m’, a file created by default in a folder called ‘SOURCE’ when I created a new project. Sure enough, there was the culprit line. More than one ‘main’ makes trouble.

Cast your (main) lines upon the water, but only one at a time.

* After I resolved this error,  it occurred to me that ‘find in project’ would have been another good way to scout out this problem.

Tuesday, November 2, 2010

Demonstrating Polymorphism OR TRAPPED IN TIME?

Version:1.0 StartHTML:0000000201 EndHTML:0000074336 StartFragment:0000002867 EndFragment:0000074300 SourceURL:file://localhost/Users/Laurel/Apps%20Learning/Journal%20TrappedInPolymorphicTime.doc
// TrappedInTime

Loading program into debugger…
Program loaded.
run
[Switching to process 7629]
Running…
    PERIOD PILOTS Staff Members are currently performing maintenance on this portal
Your trip is being routed to another time portal.
 Thank you for your patience
 ....    PERIOD PILOTS Maintenance Log for Tuesday, November 2, 2010

 Performing Maintenance on Time Portal of type: Bridge

Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Portal of type:  Canyon
Performing Maintenance on Time Port

* * * TASK CANCELLED BY PORTAL PILOT SUPERVISOR * * *



//  Or why Time Portal Constructors need to wear the right GLASSES  @ the computer
// I was so enchanted with the bug I created using an = instead of a < to control my loop, that I was determined to return
//       AFTER ALL
//  As we learn from reading history, great scientific discoveries are often made by mistake
//         OR
//  It's a feature not a bug

for(loopIndex =0; loopIndex < 2; loopIndex++)
  // for(loopIndex =0; loopIndex = 2; loopIndex++)



WHAT WE EXPECTED

This GDB was configured as "x86_64-apple-darwin".tty /dev/ttys000
Loading program into debugger…
Program loaded.
run
[Switching to process 7588]
Running…
    PERIOD PILOTS Staff Members are currently performing maintenance on this portal
Your trip is being routed to another time portal.
 Thank you for your patience
 .... 
  PERIOD PILOTS Maintenance Log for Tuesday, November 2, 2010

 Performing Maintenance on Time Portal of type: Bridge

Performing Maintenance on Time Portal of type:  Canyon

....
  Maintenance Cycle of all Time Portals in this zone,
  completed properly on Tuesday, November 2, 2010

Debugger stopped.
Program exited with status value:0.



//  GettingWorkDoneInATimelyManner

//  Demonstrating polymorphism: Using the same code with different objects
//      the object that is used is determined at runtime when I pass a message

//based on example in Quick Start Objective C , Holzner, page 139
//

#include <stdio.h>

#include <Foundation/Foundation.h>

@interface Bridge : NSObject
-(void)  print;
@end

@implementation Bridge

-(void) print
{
    printf("Performing Maintenance on Time Portal of type: Bridge\n");
}

@end
//
@interface Canyon : NSObject
-(void)  print;
@end

@implementation Canyon

-(void) print
{
    printf("Performing Maintenance on Time Portal of type:  Canyon\n");
}

@end

int main (void) {
    printf ("\t PERIOD PILOTS Staff Members are currently performing maintenance on this portal\n");
    printf("Your trip is being routed to another time portal.\n Thank you for your patience\n");

    printf("\f.... \f  PERIOD PILOTS Maintenance Log for Tuesday, November 2, 2010\n ");
   
    Bridge *c1 =  [Bridge new]  ;
    Canyon *c2 =  [Canyon new]  ;
    id pointerToObject;
    int loopIndex;
   
    pointerToObject = c1;
   
 for(loopIndex =0; loopIndex < 2; loopIndex++)
    //  for(loopIndex =0; loopIndex = 2; loopIndex++)
    {
        [pointerToObject print];
        pointerToObject = c2;
       
    }
   
   
    printf("\f.... \f  Maintenance Cycle of all Time Portals in this zone, \f  completed properly on Tuesday, November 2, 2010\n ");

    return 0;
}



Monday, November 1, 2010

Documentation: It's all Postfix Polish to me


 In the olden days, not long after the covered wagons crossed the praries committing genocide and spreading disease along the way, we had a special way of entering our data into our new modern calculators. Calculators were those devices that came after slide rulers and we needed them in order to survive physics and chemistry classes. The mathematical notation we needed to know to use these wonderful new machines was, and is, called 'Postfix Polish' (or P.F.P. as we incorrectly acronymed it). I invariably messed up P.F.P. This was the beginning of my foray into the world of looking-it-up-in-the-manual. From there I went on to fight with manuals in my first programming classes. Eventually the manual, or the online help systems that have not entirely superseeded it, become my closest friends. But in the beginning we are always a little wary of each other.


Herein lies some of my recent social encounters involving becoming friendly with documentation related to XCODE and Objective-C.


...

‘getCount’ is, I believe, a method that I’m using from a base or super class. Today I’m using it in the’constructor’ exercise on page 137 of the Quick Start book. I know what it does, it returns a count of the number of objects I’ve instantiated for a given class, but I want to know more about it.

Looking things up in this new environment, isn’t clear to me, yet. I usually start by looking for words in the index of the current book. Then I move on to trying the help menus in XCode. Today I also tried looking in the Bjarne Stroustrup book as well as The C++ Standard Library by Josuttis. I think maybe what I’m looking for today, getCount, is part of the Foundation Library (hope I’m using the right phrase). The Foundation documentation is all on line and probably within my resources right here, once I learn how to search for things properly. I tried using the HELP pulldown menu within XCode, but get no results on the string 'getCount'.  Next I put ‘NSObject’ into the ‘Q’ search box on the upper right hand corner of my current XCode window.
 



 That got me nowhere, but again choosing the HELP pulldown menu from the XCode tool bar (or maybe it’s the option bar) , this time with NSOBJECT as my search term,  took me a little further into the mysteries of documentation.

I chose ‘Search in Documentation Window’

I found it remarkably easy to get tangled up in the documentation, but by going back and forth and trying out different search terms, I finally found some information on getCount. One thing I've learned is that getCount is a function (which maybe I can translate to mean a method) related to another class I've not heard of yet. I assume that class is derived from NSObject and, somehow, methods are shared across some kind of wiring such that when I derive a class from NSObject, I can use methods associated with this (other) class.



...

Now, what was it I wanted to know about getCode?