[[[ 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:
@42
and@(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
isa
define 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.