I did a presentation at CocoaHeads Ann Arbor about Dates and Times in Cocoa. I’m pretty happy with it—a little short, but I covered a lot of important points. Missed it and want to see it live? Come to CocoaHeads Toledo on March 6 to see it!
Tag: Cocoa
CocoaConf Columbus 2012 Slides and Code
Yesterday I gave a talk on concurrency in OS X and iOS at CocoaConf Columbus. As promised, here are the slides and code:
- Slides
- Code—NSOperationQueue example
- Code—GCD Example (Note: The master branch does more than we covered. To see the end state we got to, check out the dispatch-barrier-example branch.)
Enjoy!
Autorelease is Not Your Friend
How many times have you written this line?
NSMutableArray *foo = [[[NSMutableArray alloc] init] autorelease];
At first glance, it looks fine. foo
is an autoreleased NSMutableArray
that you can use and, at the end of the method, it’s gone into the ether of the autorelease pool. Don’t get me wrong, most of the time, this use of -autorelease
is acceptable. But, in this post, I’ll try to convince you to use autorelease differently in subtle ways. Continue reading Autorelease is Not Your Friend
Quick Tip: Don’t Do This
I could not find out where a bug was coming from for the life of me today. Naturally it one of those “assignment instead of equality” bugs that seem to crop up when trying to code too quickly. The difference here was that I had implemented a subclass of NSObject
that reimplemented the method +resolveInstanceMethod:
. So, the code went like this:
+ ( BOOL )resolveInstanceMethod:( SEL )sel { if ( sel = @selector( setFoobar: )) { return class_addMethod([ self class ], sel, ( IMP )setFB, "v@:@" ); } else if ( sel = @selector( foobar )) { return class_addMethod([ self class ], sel, ( IMP )getFB, "@@:" ); } else { return [ super resolveInstanceMethod:sel ]; } }
For those of you keeping score at home, when the Objective-C runtime tried to resolve any selector, this method happily added a selector for -setFoobar:
to self
’s class and returned YES
.
Don’t do this.
Cocoa Tutorial: Strip Non-Alphanumeric Characters from an NSString
Let’s say you have an NSString that contains both alphanumeric and non-alphanumeric characters and you want to strip the non-alphanumeric characters out of it. The hard way is to manually go through, character-by-character, and put the character in a new string if it matches certain criteria. But why do it the hard way?
Apple provides a class that we can use for this to great effect: NSCharacterSet
. We want alphanumeric characters, so we can create a character set of the characters we want using this method:
NSCharacterSet *alphanumericSet = [ NSCharacterSet alphanumericCharacterSet ];
Now we have a character set like we want. We just need a way to turn our string into a string that contains only those characters. Unfortunately, the closest thing in NSString
’s implementation is the -stringByTrimmingCharactersInSet:
method. But that seems to do the opposite of what we want. Fortunately NSCharacterSet
has our back here. We can use the -invertedSet
method. So here is our final code:
NSString *beginningString = @"Some string with non-alphanumeric characters. !@#$%^&*()";
NSCharacterSet *nonalphanumericSet = [[ NSCharacterSet alphanumericCharacterSet ] invertedSet ];
NSString *endingString = [ beginningString stringByTrimmingCharactersInSet:nonalphanumericSet ];
In this example, endingString
will be equal to “Somestringwithnonalphanumericcharacters”.
UPDATE: As it turns out, this only works if the non-alphanumeric characters are at the beginning or end of the NSString
. Whoops.