Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7853209
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 2, 20262026-06-02T19:36:56+00:00 2026-06-02T19:36:56+00:00

I read here Learn C Before Objective-C? Usually I then replace some Obj-C code

  • 0

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?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-02T19:36:58+00:00Added an answer on June 2, 2026 at 7:36 pm

    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:

    ScreenShot

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I know this question has been asked before and I read all the answers
I read now a few days here and i learn a lot of things.
As I read here http://arunatennakoon.blogspot.com/2010/11/things-i-learn-new-this-week.html Friday, November 12, 2010 Things I learn new this
I'm beginning to learn python and here I'm trying to read from an xml
I try to read Claroline source code to learn from their coding. In index.php
Thanks for all the questions and responses posted on here. This site usually shows
I am trying to learn iPhone development as I've read many others on here
I read some questions here but couldn't really find the specific problem I'am faced
Questions exactly like this have been asked before, i've read them all and tried
newbie here. I am trying to learn OOD/OOP and read on the net that

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.