[[[ These ]]] are your father's square brackets, the weapons of a Jedi Knight.
Not as clumsy or random as C++.
Elegant weapons for a more civilized age.
- Apple's Objective-C books used to be top-notch, but they've been neglected and the new doc site doesn't link to them. There's PDFs at various sites.
- Cocoa Dev Central: Tutorials, books, and aggregation of other Cocoa-programming sites. You may need to use the wayback machine to read some of them.
What's Different in Mulle-ObjC
- MulleFoundation
- blog post
- feature list
ObjC 1.0: C plus Smalltalk <- appeasement of the Java Noobs ObjC++ ObjC 2.0 <- usurpation by the C++ Flagellants
This is like Objective-C circa 2010(?), good but not fully baked. Far better than circa 1986-2009, when it was a very thin translation layer over C.
- No ARC (Automatic Reference Counting). This is just invisible sugar to hide retain/release/autorelease, and while ARC's convenient, it's trivial if you actually know how reference counting works. Don't really miss it.
- No dot property syntax. [[myObj name] length]instead ofmyObj.name.length, and[myObj setName:newName]instead ofmyObj.name = newName. I can live with it, but I really did like dot syntax, even if it does "overload" the . operator and hide the distinction between methods and variables.- When dot syntax came out, Objective-C nerds came close to fistfights over this. You would not believe the venom some people had for it. Most of those nerds died or quit or got old & tired before fucking Swift came around, I guess.
 
- No array syntax. [myList objectAtIndex:i]instead ofmyList[i]. This is a pain in the ass, I'll have to write some shorthand macros (or rather, go dig them out of my very oldest code).
- No blocks. This one hurts, but it's a reasonable pick-your-battles decision. Classic: Write a method, dispatch to it, and call back success somehow. Blocks: create a weakSelf reference, enclose it, search-replace self in your block, pick one of a half-dozen complex GCD methods, get a memory leak because you retained something across the block boundary. This is annoying but logically simpler:
[self performSelectorInBackground:@selector(computeData) withObject:inputData]; - (void)computeData:(id)inputData { // create outputData [self setOutputData:outputData]; [[NSNotificationCenter defaultCenter] postNotification:NOTI_DataComputed]; }
- Has object literals: @42and@(var)create anNSNumber,@[]creates anNSArray,@{}creates anNSDictionary; dicts use key:value order, not the reverse order used in-[NSDictionary dictionaryWithObjectsAndKeys:], and array and dicts don't need a trailingnil, which was a constant source of mystifying bugs back in the day. Big win!- Hmn, crashes if you do something janky like [@[] mutableCopy]:mulle_objc_universe 0x1006adef0 fatal: unknown method 5e1b0403 "-getObjects:range:" in class 7aa0d636 "_MulleObjCEmptyArray"
 
- Hmn, crashes if you do something janky like 
- Has for (id x in container)loops, using NSFastEnumeration. The 1.0 process of looping enumerations was awful, so this is very nice.
- Huh, does have @autoreleasepool, so maybe I should use that instead of NSAutoreleasePool like a caveman? It compiles and seems to work.
- Properties have properties assign/retain nonatomic/atomic nonnullable readonly, default is assign nonatomic, no "nullable" or "readwrite" flags needed. As it should be.
- Weird isadefine instead of pointer: blog post
TODO
- I haven't set up an NSRunLoop or the equivalent of NSApplication (which is in AppKit, not Foundation), need to do that and then I'll have a working app template.
