IOS EXC_BAD_INSTRUCTION while "int y = 0;" - objective-c

I have this call in UIViewController-inheritor class context:
+ (void) smthPressed: (id) caller
{
// some code here
// ...
startTimers();
}
startTimers declared as:
inline void startTimers()
{
NSString * x = #""; // falls here with EXC_BAD_INSTRUCTION
// some other codes here
}
What the HELL is going on?
P.S.:
inline void startTimers()
{
int x = 0;
int y = 0; // EXC_BAD_INSTRUCTION here. Stack couldn't end there!
// ...
P.P.S.:
Documentation says: "For most non-memory access exceptions (for example, EXC_BAD_INSTRUCTION ...)", so it is NOT mem-access fault.
P.P.P.S.: arch is Standart (armv6 armv7). Nothing changes if I set Optimized (armv7).

Perhaps you have corrupted your stack accidentally. Does it occur when you place the startTimers() code elsewhere in your program?
Try using NSZombieEnabled and the static analyser to look for other places in your code you might be making memory-management errors that could lead to a write to a stack variable being invalid (overflowing arrays on the stack, bad pointers, etc).
You could also try switching compilers, if that option is available to you, in the extremely rare case that you hit a complier bug.

I think there is compiler issue here. Now, 6 years since your raising the issue, if I try to get your original code to compile it fails. It's down to the static keyword. The following code compiles and runs ok:
#import "ViewController.h"
#interface ViewController ()
#end
#implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[ViewController smthPressed:self];
}
// Without the "static" keyword compile fails
static inline void fakeStartTimers() {
int x = 0;
int y = 0;
printf("x and y are %d %d", x, y);
}
+ (void)smthPressed:(id) caller
{
fakeStartTimers();
}
#end
This is with the compiler
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang --version
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Related

Unable to send a message to an Objective C method with multiple parameters [duplicate]

This question already has answers here:
"Thread 1: stopped at breakpoint" error when initializing an NSURL object
(3 answers)
Closed 8 years ago.
I am unable to send a message to an Objective C method with multiple parameters. The method has two parameters, a NSString object and a Boolean variable. I can successfully make the call when I edit my method code so it only has either one of these parameters, but not both. I don't get any compile errors. When I run the program, the program stops and I get a breakpoint at the method call, but the XCode debugger doesn't give any additional info on why it stopped there. I can then choose to continue running the program and it performs as expected. I currently am calling the method from within another method of the same class. I have tried calling the method directly from main, but have the same issue. I have tried numerous changes within the saySomething method, including just commenting out the entire contents of the method, but my program still stops at the method call. My interface and implementation files are below. Thanks for any help you can provide!
Edit: I have also added the code from main as requested.
#interface XYZPerson : NSObject
- (void) sayHello;
- (void) saySomething:(NSString *)whatToSay loudly:(Boolean)toYell;
#end
#implementation XYZPerson
- (void)sayHello
{
NSString *greeting = #"Hello, World!";
[self saySomething:greeting loudly:YES];
}
- (void)saySomething:(NSString *)whatToSay loudly:(Boolean)toYell
{
NSString *whatToSayEdited = whatToSay;
if (toYell == YES) {
whatToSayEdited = [whatToSay uppercaseString];
}
NSLog(#"%#", whatToSayEdited);
}
#end
int main(int argc, const char * argv[])
{
#autoreleasepool {
// insert code here...
XYZPerson *somePerson = [[XYZPerson alloc] init];
[somePerson sayHello];
}
return 0;
}
Sounds like you have a breakpoint set at the
if (toYell == YES) {
whatToSayEdited = [whatToSay uppercaseString];
}
block of code, that would explain why without the second parameter it runs smoothly, but stops when you set both parameters.
if it continues to run properly after you tell it to continue it is not an error but really just a breakpoint. Look on the left side of your editor where the line numbers are. Breakpoints appear as blue blocky arrows.

Is property getter called even if I access property by name?

Let's say that I declare property in following way:
#property(nonatomic, strong, getter = isWorking) BOOL working;
Then instead of having the property to be synthesized I write the getter myself (and add some custom logic to it).
What will happen if I access the property in following way:
BOOL work = self.working;
Is the getter (and my custom logic there) still called or is it called only when I access the property using getter explicitly (BOOL work = self.isWorking;) ?
Oops. Just tried it. Apparently i use dot notation too much, and didn't realize just how much it was doing. :P
#import "NSObject.h"
#include <stdio.h>
#interface Test : NSObject
#property (getter=myStuff) int stuff;
#end
#implementation Test
-(int)myStuff { return 42; }
-(void)setStuff:(int)value { /* don't care */ }
#end
int main() {
#autoreleasepool {
Test* test = [[Test alloc] init];
/* All these work... */
printf("test.stuff == %d\n", test.stuff);
printf("[test myStuff] == %d\n", [test myStuff]);
printf("test.myStuff == %d\n", test.myStuff);
/* but here, there's an exception */
printf("[test stuff] == %d\n", [test stuff]);
return 0;
}
}
When i compile this (using clang in Linux), there are two warnings about the oddness of a missing -(int)stuff. And the output looks like
chao#chao-VirtualBox:~/code/objc$ ./a.out
test.stuff == 42
[test myStuff] == 42
test.myStuff == 42
: Uncaught exception NSInvalidArgumentException, reason: -[Test stuff]: unrecognized selector sent to instance 0x2367f38
chao#chao-VirtualBox:~/code/objc$
So, umm, yeah. Disregard half of the stuff below. :P
self.working is just syntactic sugar for [self working] (or [self setWorking:value] if you're assigning to it). Either one will do the same thing: return the value of [self isWorking], because that's the getter you defined.
If you want to avoid the getter, try _working or self->_working (or whatever you named the ivar). Otherwise, self.working, [self working], and [self isWorking] (and even self.isWorking if you're feeling brave) should all give you the same result.

What does the unavailable attribute in Objective C mean?

What does the unavailable attribute in Objective C do?
__attribute__((unavailable("message")))
Is there any online reference to this and other attributes in Clang?
The unavailable attribute marks a function declaration so that you can generate an error message if someone tries to use it. It's essentially the same as the deprecated attribute, except that trying to use a deprecated function just causes a warning, but using an unavailable one causes an error. Documentation at: http://clang.llvm.org/docs/LanguageExtensions.html
Here's a simple use case example. First the code:
void badFunction(void) __attribute__((unavailable("Don't use badFunction, it won't work.")));
int main(void)
{
badFunction();
return 0;
}
And then building it:
$ make example
cc example.c -o example
example.c:5:5: error: 'badFunction' is unavailable: Don't use badFunction, it
won't work.
badFunction();
^
example.c:1:6: note: function has been explicitly marked unavailable here
void badFunction(void) __attribute__((unavailable("Don't use...
^
1 error generated.
make: *** [example] Error 1
Without getting into a discussion of the pros and cons of singleton objects, attribute((unavailable("message"))) is handy for preventing singletons from being instantiated outside of the standard "sharedInstance" method.
For instance, in the header file of your singleton manager object the following lines will prevent the use of alloc, init, new or copy.
// clue for improper use (produces compile time error)
+ (instancetype)alloc __attribute__((unavailable("alloc not available, call sharedInstance instead")));
- (instancetype)init __attribute__((unavailable("init not available, call sharedInstance instead")));
+ (instancetype)new __attribute__((unavailable("new not available, call sharedInstance instead")));
- (instancetype)copy __attribute__((unavailable("copy not available, call sharedInstance instead")));
In order to instantiate your singleton you will need to roll your own custom initialization routine. Something along the lines of:
#interface singletonManager ()
-(instancetype)initUniqueInstance;
#end
#implementation singletonManager
+ (instancetype)sharedInstance
{
static id instance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&once_token,^
{
instance = [[super alloc] initUniqueInstance];
});
return instance;
}
- (instancetype)initUniqueInstance
{
if (( self = [super init] ))
{
//regular initialization stuff
}
return self;
}
#end

Exception Handling Help Xcode 4.6

Hello I am pretty new to programming but I have been following a few tutorials in Objective C. I just came across a problem in a Exception Handling tutorial and well, my code didn't work the same way.
First of all this is my code in main:
#import < Foundation/Foundation.h>
#import "Numz.h"
int main(int argc, const char * argv[]){
#autoreleasepool {
Numz *n = [[Numz alloc]init];
#try {
[n thisisgoingtogetanerror] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< error on this line
}
#catch (NSException *e) {
NSLog(#"you got an error in your program");
}
NSLog(#"this is code aftr the error");
}
return 0;
}
The error above says
no visible #interface for 'Numz' declares the selector
'thisisgoingtogetanerror'
My interface and implementation are created but have no variables or methods created inside, but isn't that why I need to handle the error in the first place?
Also, I can't get any kind of console view either, the build just fails and points me at that error.
It might be some settings in xcode 4.6 that I need to change but I can't get the code to run and handle the error. I have looked online and can't find any answers.
Any help would be great.
The compiler is complaining because you are calling a method that it has not seen a declaration of ever.
Change it to (assuming Numz is not a subclass of NSArray nor implements the count method): [n count];.
Note that you should never use exceptions for flow control. That is, you should not #throw an exception and then use #catch to process the exception and continue execution. Exceptions in iOS/Cocoa are only used to indicate unrecoverable errors.
Try this:
#interface NSObject(Badness)
- (void)methodBadness;
#end
Then call that method in your code. Compiler shouldn't warn, runtime should #throw.
Exception handling is used for errors/exceptions at runtime. But the error you get occurs at compile time
You can cause a runtime error through something like this:
#interface RuntimeError : NSObject
+ (void)cause;
#end
#implementation RuntimeError
+ (void)cause {
NSAssert(NO, #"This is a runtime error caused through a assertion failure")
}
#end
// Call it with
// [RuntimeError cause]
// inside the #try-Block

How to write iOS app purely in C

I read here Learn C Before Objective-C?
Usually I then replace some Obj-C code with pure C code (after all you can mix them as much as you like, the content of an Obj-C method can be entirely, pure C code)
Is this true?
Is it possible to build an iPhone app purely in the C programming language?
Damn, it took me a while but I got it:
main.c:
#include <CoreFoundation/CoreFoundation.h>
#include <objc/runtime.h>
#include <objc/message.h>
// This is a hack. Because we are writing in C, we cannot out and include
// <UIKit/UIKit.h>, as that uses Objective-C constructs.
// however, neither can we give the full function declaration, like this:
// int UIApplicationMain (int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
// So, we rely on the fact that for both the i386 & ARM architectures,
// the registers for parameters passed in remain the same whether or not
// you are using VA_ARGS. This is actually the basis of the objective-c
// runtime (objc_msgSend), so we are probably fine here, this would be
// the last thing I would expect to break.
extern int UIApplicationMain(int, ...);
// Entry point of the application. If you don't know what this is by now,
// then you probably shouldn't be reading the rest of this post.
int main(int argc, char *argv[])
{
// Create an #autoreleasepool, using the old-stye API.
// Note that while NSAutoreleasePool IS deprecated, it still exists
// in the APIs for a reason, and we leverage that here. In a perfect
// world we wouldn't have to worry about this, but, remember, this is C.
id autoreleasePool = objc_msgSend(objc_msgSend(objc_getClass("NSAutoreleasePool"), sel_registerName("alloc")), sel_registerName("init"));
// Notice the use of CFSTR here. We cannot use an objective-c string
// literal #"someStr", as that would be using objective-c, obviously.
UIApplicationMain(argc, argv, nil, CFSTR("AppDelegate"));
objc_msgSend(autoreleasePool, sel_registerName("drain"));
}
AppDelegate.c:
#import <objc/runtime.h>
#import <objc/message.h>
// This is equivalent to creating a #class with one public variable named 'window'.
struct AppDel
{
Class isa;
id window;
};
// This is a strong reference to the class of the AppDelegate
// (same as [AppDelegate class])
Class AppDelClass;
// this is the entry point of the application, same as -application:didFinishLaunchingWithOptions:
// note the fact that we use `void *` for the 'application' and 'options' fields, as we need no reference to them for this to work. A generic id would suffice here as well.
BOOL AppDel_didFinishLaunching(struct AppDel *self, SEL _cmd, void *application, void *options)
{
// we +alloc and -initWithFrame: our window here, so that we can have it show on screen (eventually).
// this entire method is the objc-runtime based version of the standard View-Based application's launch code, so nothing here really should surprise you.
// one thing important to note, though is that we use `sel_getUid()` instead of #selector().
// this is because #selector is an objc language construct, and the application would not have been created in C if I used #selector.
self->window = objc_msgSend(objc_getClass("UIWindow"), sel_getUid("alloc"));
self->window = objc_msgSend(self->window, sel_getUid("initWithFrame:"), (struct CGRect) { 0, 0, 320, 480 });
// here, we are creating our view controller, and our view. note the use of objc_getClass, because we cannot reference UIViewController directly in C.
id viewController = objc_msgSend(objc_msgSend(objc_getClass("UIViewController"), sel_getUid("alloc")), sel_getUid("init"));
// creating our custom view class, there really isn't too much
// to say here other than we are hard-coding the screen's bounds,
// because returning a struct from a `objc_msgSend()` (via
// [[UIScreen mainScreen] bounds]) requires a different function call
// and is finicky at best.
id view = objc_msgSend(objc_msgSend(objc_getClass("View"), sel_getUid("alloc")), sel_getUid("initWithFrame:"), (struct CGRect) { 0, 0, 320, 480 });
// here we simply add the view to the view controller, and add the viewController to the window.
objc_msgSend(objc_msgSend(viewController, sel_getUid("view")), sel_getUid("addSubview:"), view);
objc_msgSend(self->window, sel_getUid("setRootViewController:"), viewController);
// finally, we display the window on-screen.
objc_msgSend(self->window, sel_getUid("makeKeyAndVisible"));
return YES;
}
// note the use of the gcc attribute extension (constructor).
// Basically, this lets us run arbitrary code before program startup,
// for more information read here: http://stackoverflow.com/questions/2053029
__attribute__((constructor))
static void initAppDel()
{
// This is objc-runtime gibberish at best. We are creating a class with the
// name "AppDelegate" that is a subclass of "UIResponder". Note we do not need
// to register for the UIApplicationDelegate protocol, that really is simply for
// Xcode's autocomplete, we just need to implement the method and we are golden.
AppDelClass = objc_allocateClassPair(objc_getClass("UIResponder"), "AppDelegate", 0);
// Here, we tell the objc runtime that we have a variable named "window" of type 'id'
class_addIvar(AppDelClass, "window", sizeof(id), 0, "#");
// We tell the objc-runtime that we have an implementation for the method
// -application:didFinishLaunchingWithOptions:, and link that to our custom
// function defined above. Notice the final parameter. This tells the runtime
// the types of arguments received by the function.
class_addMethod(AppDelClass, sel_getUid("application:didFinishLaunchingWithOptions:"), (IMP) AppDel_didFinishLaunching, "i#:##");
// Finally we tell the runtime that we have finished describing the class and
// we can let the rest of the application use it.
objc_registerClassPair(AppDelClass);
}
View.c
#include <objc/runtime.h>
// This is a strong reference to the class of our custom view,
// In case we need it in the future.
Class ViewClass;
// This is a simple -drawRect implementation for our class. We could have
// used a UILabel or something of that sort instead, but I felt that this
// stuck with the C-based mentality of the application.
void View_drawRect(id self, SEL _cmd, struct CGRect rect)
{
// We are simply getting the graphics context of the current view,
// so we can draw to it
CGContextRef context = UIGraphicsGetCurrentContext();
// Then we set it's fill color to white so that we clear the background.
// Note the cast to (CGFloat []). Otherwise, this would give a warning
// saying "invalid cast from type 'int' to 'CGFloat *', or
// 'extra elements in initializer'. Also note the assumption of RGBA.
// If this wasn't a demo application, I would strongly recommend against this,
// but for the most part you can be pretty sure that this is a safe move
// in an iOS application.
CGContextSetFillColor(context, (CGFloat []){ 1, 1, 1, 1 });
// here, we simply add and draw the rect to the screen
CGContextAddRect(context, (struct CGRect) { 0, 0, 320, 480 });
CGContextFillPath(context);
// and we now set the drawing color to red, then add another rectangle
// and draw to the screen
CGContextSetFillColor(context, (CGFloat []) { 1, 0, 0, 1 });
CGContextAddRect(context, (struct CGRect) { 10, 10, 20, 20 });
CGContextFillPath(context);
}
// Once again we use the (constructor) attribute. generally speaking,
// having many of these is a very bad idea, but in a small application
// like this, it really shouldn't be that big of an issue.
__attribute__((constructor))
static void initView()
{
// Once again, just like the app delegate, we tell the runtime to
// create a new class, this time a subclass of 'UIView' and named 'View'.
ViewClass = objc_allocateClassPair(objc_getClass("UIView"), "View", 0);
// and again, we tell the runtime to add a function called -drawRect:
// to our custom view. Note that there is an error in the type-specification
// of this method, as I do not know the #encode sequence of 'CGRect' off
// of the top of my head. As a result, there is a chance that the rect
// parameter of the method may not get passed properly.
class_addMethod(ViewClass, sel_getUid("drawRect:"), (IMP) View_drawRect, "v#:");
// And again, we tell the runtime that this class is now valid to be used.
// At this point, the application should run and display the screenshot shown below.
objc_registerClassPair(ViewClass);
}
It's ugly, but it works.
If you would like to download this, you can get it from my dropbox here
You can get it from my GitHub repository here:
Objective-C is a superset of the C-language, so it is theoretically possible to write a program entirely in C, however, unless you are thoroughly versed in OpenGL ES, You'll need to do at least some objC (Even Rich's sample has a const NSString* in it), else you'll have to write the views yourself.
OK, the above is completely wrong. Let me say, I'm astounded Rich achieved this lofty goal, so I ported it over to the mac (source here). The files below have no headers, do not link to Cocoa, nor does the project have a nib:
AppDelegate.m
#include <objc/runtime.h>
#include <objc/message.h>
extern id NSApp;
struct AppDel
{
Class isa;
//Will be an NSWindow later, for now, it's id, because we cannot use pointers to ObjC classes
id window;
};
// This is a strong reference to the class of the AppDelegate
// (same as [AppDelegate class])
Class AppDelClass;
BOOL AppDel_didFinishLaunching(struct AppDel *self, SEL _cmd, id notification) {
//alloc NSWindow
self->window = objc_msgSend(objc_getClass("NSWindow"),
sel_getUid("alloc"));
//init NSWindow
//Adjust frame. Window would be about 50*50 px without this
//specify window type. We want a resizeable window that we can close.
//use retained backing because this thing is small anyhow
//return no because this is the main window, and should be shown immediately
self->window = objc_msgSend(self->window,
sel_getUid("initWithContentRect:styleMask:backing:defer:"),(NSRect){0,0,1024,460}, (NSTitledWindowMask|NSClosableWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask),NSBackingStoreRetained,NO);
//send alloc and init to our view class. Love the nested objc_msgSends!
id view = objc_msgSend(objc_msgSend(objc_getClass("View"), sel_getUid("alloc")), sel_getUid("initWithFrame:"), (struct CGRect) { 0, 0, 320, 480 });
// here we simply add the view to the window.
objc_msgSend(self->window, sel_getUid("setContentView:"), view);
objc_msgSend(self->window, sel_getUid("becomeFirstResponder"));
//makeKeyOrderFront: NSWindow to show in bottom left corner of the screen
objc_msgSend(self->window,
sel_getUid("makeKeyAndOrderFront:"),
self);
return YES;
}
static void initAppDel()
{
//Our appDelegate should be NSObject, but if you want to go the hard route, make this a class pair of NSApplication and try initing those awful delegate methods!
AppDelClass = objc_allocateClassPair((Class)
objc_getClass("NSObject"), "AppDelegate", 0);
//Change the implementation of applicationDidFinishLaunching: so we don't have to use ObjC when this is called by the system.
class_addMethod(AppDelClass,
sel_getUid("applicationDidFinishLaunching:"),
(IMP) AppDel_didFinishLaunching, "i#:#");
objc_registerClassPair(AppDelClass);
}
void init_app(void)
{
objc_msgSend(
objc_getClass("NSApplication"),
sel_getUid("sharedApplication"));
if (NSApp == NULL)
{
fprintf(stderr,"Failed to initialized NSApplication... terminating...\n");
return;
}
id appDelObj = objc_msgSend(
objc_getClass("AppDelegate"),
sel_getUid("alloc"));
appDelObj = objc_msgSend(appDelObj, sel_getUid("init"));
objc_msgSend(NSApp, sel_getUid("setDelegate:"), appDelObj);
objc_msgSend(NSApp, sel_getUid("run"));
}
//there doesn't need to be a main.m because of this little beauty here.
int main(int argc, char** argv)
{
//Initialize a valid app delegate object just like [NSApplication sharedApplication];
initAppDel();
//Initialize the run loop, just like [NSApp run]; this function NEVER returns until the app closes successfully.
init_app();
//We should close acceptably.
return EXIT_SUCCESS;
}
View.m
#include <objc/runtime.h>
#include <objc/message.h>
#include <ApplicationServices/ApplicationServices.h>
// This is a strong reference to the class of our custom view,
// In case we need it in the future.
Class ViewClass;
// This is a simple -drawRect implementation for our class. We could have
// used a UILabel or something of that sort instead, but I felt that this
// stuck with the C-based mentality of the application.
void View_drawRect(id self, SEL _cmd, CGRect rect)
{
//make a red NSColor object with its convenience method
id red = objc_msgSend(objc_getClass("NSColor"), sel_getUid("redColor"));
// fill target rect with red, because this is it!
NSRect rect1 = NSMakeRect ( 21,21,210,210 );
objc_msgSend(red, sel_getUid("set"));
NSRectFill ( rect1 );
}
// Once again we use the (constructor) attribute. generally speaking,
// having many of these is a very bad idea, but in a small application
// like this, it really shouldn't be that big of an issue.
__attribute__((constructor))
static void initView()
{
// Once again, just like the app delegate, we tell the runtime to
// create a new class, this time a subclass of 'UIView' and named 'View'.
ViewClass = objc_allocateClassPair((Class) objc_getClass("NSView"), "View", 0);
// and again, we tell the runtime to add a function called -drawRect:
// to our custom view. Note that there is an error in the type-specification
// of this method, as I do not know the #encode sequence of 'CGRect' off
// of the top of my head. As a result, there is a chance that the rect
// parameter of the method may not get passed properly.
class_addMethod(ViewClass, sel_getUid("drawRect:"), (IMP) View_drawRect, "v#:");
// And again, we tell the runtime that this class is now valid to be used.
// At this point, the application should run and display the screenshot shown below.
objc_registerClassPair(ViewClass);
}
prefix.pch
//
// Prefix header for all source files of the 'CBasedMacApp' target in the 'CBasedMacApp' project
//
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
#endif
I read here Learn C Before Objective-C?
Usually I then replace some Obj-C code with pure C code (after all you can mix them as much as you like, the content of an Obj-C method can be entirely, pure C code)
Is this true?
Could I build an iPhone app purely in the C programming language?
The quoted passage is true, but the answer to your question is no.
To illustrate what answerer Mecki on that other question was talking about:
- (void) drawRect:(CGRect)dirtyRect { //Objective-C
CGContextRef context = UIGraphicsGetCurrentContext(); //C
CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); //C
CGContextFillRect(context, dirtyRect); //C
} //Objective-C (balances above “- (void) drawRect:…” line)
There is nothing but pure C code within this method, but the method itself is Objective-C code, as is the class that contains this method.
So it is possible to do what Mecki said, but you can't (practically—as Richard J. Ross III showed, it's technically possible but quite a lot of typing) write a whole Cocoa Touch program in pure C.
Actually, some of the code posted here, while written in C, is still calling objective-C code :). I don't know if that actually fits the scenario from the original poster when he asked
Is it possible to build an iPhone app purely in the C programming
language?
but I would agree with the people saying that, generally speaking and for an app with a GUI, you would need to write your GUI in OpenGL (which is C).
I think that is what most games do, right? Although I'm not sure if there's access to the iPhone's I/O (the touchscreen for example) in C.
Last but not least, the guys that wrote the code above rock! :)