Cocoa

4 months ago

Steve Jobs 1955-2011

I was completely shocked when I read this morning on my iPhone that Steve passed away. All my thoughts and sympathy goes out to his family and friends. Please be strong and accept the condolences of me and my family.

This day in my life is dedicated to Steve Jobs, I will think of him as of the great man he was and the one person who changed and influenced my life the most. Every single piece of software I write, every graphical user interface I create has a touch of his visions and so he will live on in me, till my time comes to meet him in another place.

I will miss you – Take care where ever you are,
Sascha Müllner

iPhone OS: Design a nice InApp Purchase View

0

To get up a nice InAppPurchase View for Apple’s AppStore, we first need some good looking buttons:

http://code.google.com/p/iphonegradientbuttons/
http://undefinedvalue.com/2010/02/27/shiny-iphone-buttons-without-photoshop/
http://iphonedevelopment.blogspot.com/2010/05/improved-gradient-buttons.html
http://stackoverflow.com/questions/422066/gradients-on-uiview-and-uilabels-on-iphone/

There are also some tweaks for the UITableView you might consider using:
http://stackoverflow.com/questions/400965/how-to-customize-the-background-border-colors-of-a-grouped-table-view/
http://stackoverflow.com/questions/986392/programmatically-force-a-uiscrollview-to-stop-scrolling-for-sharing-a-table-view/

more information upcoming…

iPhone OS: Setup an additional Security Layer

0

As you might already know the iPhone is itself not that secure that people might think (news is german):

http://www.heise.de/security/meldung/Luecke-in-Datenverschluesselung-des-iPhones-1007818.html

How do you prevent intrusion of your customers data? As a really pragmatic approach, we can just set up additional encryption for our application data:

http://stackoverflow.com/questions/2579453/nsdata-aes-class-encryption-decryption-in-cocoa
http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html
http://pastie.org/974094/

So if you use for example core data, then on application start you decrypt the database and after termination encrypt it, using the AES class. These are only some basic thoughts and I think that you are better of using higher encryption like blowfish 448bit or even combine it with AES256bit. These encryption is

Your data might live now a little bit securer, but to prevent also code intrusion, you REALLY should strip symbols and obfuscate your code:

http://stackoverflow.com/questions/2442189/write-secure-cocoa-code

and never ever store any secrets or keys in your code!

Also there are some nice reads from Apple you might consider looking at:

http://images.apple.com/iphone/business/docs/iPhone_Security_Overview.pdf

http://www.apple.com/iphone/business/integration/

iPhone OS: ffmpeg for the iphone – Part 1

0

I am just checking if it is possible to get WMV9 support for one of my applications on the iphone using ffmpeg.

The good point a lot of people tried to get these working, but actually none covered if his application was approved for the AppStore. Due to Apples guidelines there might be some problems to get an approval. For now just some informations, I already collected:

http://code.google.com/p/ffmpeg4iphone/

http://github.com/yuvi/gas-preprocessor/

http://stackoverflow.com/questions/1679649/using-ffmpeg-library-with-iphone-sdk-for-video-encoding

These where basically my first finds – interesting reads, but after some more searching I found what I was really looking for, build scripts for Cortex8, arm1176jzf and i386 (aka iPhone Simulator)

http://github.com/gabriel/ffmpeg-iphone-build

If you combine these with the iFrameExtractor example project I found here:

http://www.codza.com/extracting-frames-from-movies-on-iphone

you got a really nice demo project for the use of ffmpeg, which is also able to run in the iPhone Simulator. Lots of video formats are supported out of the box and you can also for example play Adobe Flash files. Streaming capabilities are there, but for flash you might need to fiddle a bit.

I will setup a demo project and ask the codza guys if they have no problem if I host it here.

Cocoa: Core-Plot for MacOS X and iPhone

0

If you want to draw nice plots or graphs on the Mac or the iPhone, then you will come across core-plot. This opensource project really works well and following some of the links should give you a good start

Google Code Page:
http://code.google.com/p/core-plot

Tutorials:
http://www.switchonthecode.com/tutorials/using-core-plot-in-an-iphone-application
http://blogs.remobjects.com/blogs/mh/2010/01/26/p973

Core Animation Tutorials

0

I found a nice site which features a tutorial for Core Animation:

http://theocacao.com/document.page/533

Cocoa: Debugging retain counts

0

This article is a big Time Save if you are debugging retain counts in Cocoa.

Original version (Aaron Hillgrass): http://weblog.bignerdranch.com/?p=2
This article, originally published in MacTech Magazine, gives tips on how to write your code such that retain count problems are easier to find and how to locate the problem when symptoms appear.

Before delving into all the ways to find them, let’s quickly review the lifetime of an object on the heap. The object is allocated (through the +allocWithZone: method which calls the malloc_zone_calloc() function), it is used, and then it is deallocated (through the -dealloc method which calls the malloc_zone_free() function).
Complicating matters is the retain count. A newly allocated object has a retain count of 1. When an object is retained, the retain count is incremented. When it is released, the retain count is decremented. When the retain count goes to zero, the object is deallocated.
This is complicated even further by the autorelease pool. When an object is sent the message autorelease, it adds itself to the current autorelease pool. When the autorelease pool is deallocated, it send the message release to every object in the pool. In a Cocoa application, the autorelease pool is deallocated after each event is handled.
Use release when possible

Here are two similar erroneous methods:

- (void)bad {

NSArray *array = [[NSArray alloc] init];

[array release];

[array release];

}

- (void)worse {

NSArray *array = [[NSArray alloc] init];

[array release];

[array autorelease];

}

If the first method is run inside a debugger, it will stop on the erroneous line with a BAD_ACCESS error. The second method will cause a BAD_ACCESS only when the autorelease pool is deallocated. In a large program, it may be difficult to back track to where you autoreleased that object. Using release, besides being more efficient, will make your code easier to debug.
Likewise, use init instead of a convenience method and a retain. For example:
NSString *x; x = [NSString stringWithFormat:@"I like %d!", 2]; [x retain];

is not as good as:
NSString *x; x = [[NSString alloc] initWithFormat:@”I like %d!”, 2];

Note that this does not mean that you should break conventions: when creating an object to be vended out, it should be autoreleased:
- (NSNumber *)currentPrice { NSNumber *p; p = [[NSNumber alloc] initWithInt:(whatMarketWillBear – 1)]; [p autorelease]; return p; }
Set Pointers to nil after Objects are Released

To make it impossible to send messages to released objects, set the pointer to nil after the object is released:
- (void)fireThem { [employees release]; employees = nil; }
Using Zombies

This code (which uses an object after it has been deallocated) often runs without crashing or throwing exceptions:
- (IBAction)stupidAction:(id)sender { NSMutableString *string = [[nameField stringValue] mutableCopy]; [string release]; NSMutableString *p; p = [NSMutableString stringWithFormat:@"I'm new!"]; NSLog(@”string = %@”, string); }

The new string object is sometimes created in the same place in memory that the old one had occupied. So, when you run this you sometimes see:
string = I’m new!

On the other hand, sometimes the new string isn’t created in the same location and the application crashes with a BAD_ACCESS. As you can imagine, hunting down a bug that may or may not rear its ugly head can be maddening.
To debug this code, instead of freeing the memory for reuse, turn the objects into zombies. When you try to use a zombie, Cocoa will throw an exception. Thus, you can consistently reproduce this bug. The trick, then, is to tell Foundation and CoreFoundation, that you want to zombify your objects instead of freeing them.
First, you need to use the debug version of the CoreFoundation framework. To do this, select your executable in Xcode, and in the inspector under the General tab, choose €œUse the debug suffix when loading frameworks.€
debugsuffix-2008-11-5-23-42.png
Then, under the Arguments tab, set the environment variable NSZombieEnabled to YES and CFZombieLevel to 3 (screenshot should have 3, not 5.):
zombies-2008-11-5-23-42.png
Now when you send a message to a released object you will get a nice exception like this:
*** Selector ‘respondsToSelector:’ sent to dealloced instance 0×328840 of class NSMutableString.

(Remember to disable zombies once the bug is found €” you want the objects to be freed, not zombified in a deployed app.)
Putting a breakpoint on exceptions

Now that you have an exception that is thrown consistently, you will need to create a breakpoint in the debugger where the exception gets raised. Before dealing with the debugger, let’s review how exceptions get thrown.
The Cocoa libraries check certain conditions, and if the conditions are not met, they raise exceptions. For example, if you ask for the second item in an array that has only one item, an exception will be thrown. Throwing an exception looks like this:
if (x == 13) { NSException *badness;

badness = [NSException exceptionWithName:@"BadLuckException"

reason:@"13 is unlucky"

userInfo:nil];

[badness raise];

}

Thus, to stop the debugger as soon as an exception is raised, you can add the breakpoint for -[NSException raise]using the breakpoint panel.
breakpoint-2008-11-5-23-42.jpg
Gradually, Cocoa programmers are moving to the new @throw/@catch/@finally form of exceptions stolen from C++ and Java. In this form, you will throw exceptions like this:
NSException *badness; badness = [NSException exceptionWithName:@"BadLuckException" reason:@"13 is unlucky" userInfo:nil]; @throw badness;

(To use new-style exceptions, you must pass the -fobjc-exceptions flag to the compiler.)
To detect when an exception is being thrown from within the debugger, you will want to create a breakpoint onobjc_exception_throw.
You will want these breakpoints every time you run the debugger. To automatically add these breakpoints anytime you use gdb, create a .gdbinit file in your home directory and include these lines:
fb -[NSException raise] fb objc_exception_throw()

In summary, here are the four tips for this week:

  • release instead of autorelease when possible
  • After releasing an object, set pointers to it to nil
  • Use zombies to hunt down retain/release problems
  • Add breakpoints to stop on exceptions

I hope they are useful to you.

Use CFRunLoopRun to synchronize NSMetadataQuery

0

- (NSArray *)completionsForPartialWordRange: (NSRange)charRange indexOfSelectedItem: (int *)index

{

// get the current word. That will be the keyword in our query

NSString *word = [[self string] substringWithRange: charRange];

// construct the query string from this word:

NSString *queryString = @”someQueryString”;

// construct the objects needed to perform the query

NSMetadataQuery *query = [[NSMetadataQuery alloc] init];

NSPredicate *pred = [NSPredicate predicateWithFormat: queryString];

;

// register the call-back

[[NSNotificationCenter defaultCenter]

addObserver: self

selector: @selector(queryHandler:)

name: NSMetadataQueryDidFinishGatheringNotification

object: query];

;

//start a new run loop

CFRunLoopRun();

// after the new loop is finished, continue by returning the new suggestions:

return [self suggestions];

}

- (void)queryHandler: (NSNotification *) inNotification

{

NSMetadataQuery *query = [inNotification object];

NSArray *suggestions = // create the suggestions array from the query result

[self setSuggestions: suggestions];

// stop the new run loop

CFRunLoopStop(CFRunLoopGetCurrent ());

}

This code was just found on:

http://lists.apple.com/archives/Cocoa-dev/2006/Oct/msg00907.html

Seems to be that the guy also added it to his blog:

http://confuseddevelopment.blogspot.com/2006_10_01_archive.html

The solution looks not very error proved but might someon help…

Cocoa: Secure License Framework for Kagi

0

http://www.aquaticmac.com/

Plot Frameworks

0

After looking for some niceplot frameworks for Cocoa, I found this three starting points:http://developer.snowmintcs.com/frameworks/sm2dgraphview/index.htmlhttp://sourceforge.net/project/showfiles.php?group_id=79925http://www.vtk.org/
technorati tags:plot, framework, cocoa

Go to Top