mjtsai + gparker   236

Twitter
Example: class NSObject moved from CoreFoundation to libobjc in macOS 10.8. libobjc has $ld$hide symbols for old OS versions ("NSObject is here, but it used to be somewhere else"). CF has $ld$add symbols for old OS versions ("NSObject is elsewhere, but it used to be here").

— Greg Parker (@gparker) February 11, 2020
FavoriteTweet  gparker 
8 days ago by mjtsai
Twitter
Is there a way to manually request that a non-smol string be made smol if possible and have its allocation discarded, since you're unwilling to do that automatically?

— Greg Parker (@gparker) February 10, 2020
FavoriteTweet  gparker 
8 days ago by mjtsai
Twitter
Performance win #2: regions. Regions streamed their data in scanline order: {y1, x1, …, xN, STOP, y2, x1, …, xN, STOP, …}. Storing Rects and Points in the same y-first order similarly saves an instruction or two when packing and unpacking region data.

— Greg Parker (@gparker) December 30, 2019
FavoriteTweet  gparker 
7 weeks ago by mjtsai
Twitter
Performance win #1: parameters. A parameter list of (x, y) would be pushed to the stack in (y, x) order on that system. Arranging the struct in (y, x) order would save an instruction or two every time coordinates were copied to or from a parameter list.

— Greg Parker (@gparker) December 30, 2019
FavoriteTweet  gparker 
7 weeks ago by mjtsai
Twitter
I always wondered why the Rect and Point structs in the original Mac's QuickDraw graphics stored data in {top, left, bottom, right} and {y, x} order even though everywhere else the coordinates were in {left, top, right, bottom} and {x, y} order. I think I know now: performance.

— Greg Parker (@gparker) December 30, 2019
FavoriteTweet  gparker 
7 weeks ago by mjtsai
Twitter
Annual reminder: if you don't know the difference between "YYYY" and "yyyy", you should be using "yyyy". This year the mismatch starts on December 29th.

— Greg Parker (@gparker) December 20, 2019
FavoriteTweet  gparker 
8 weeks ago by mjtsai
Twitter
Nope! Waiting readers might be able to boost a single writer. But efficiently tracking and boosting multiple readers on behalf of a waiting writer is hard.

— Greg Parker (@gparker) December 17, 2019
FavoriteTweet  gparker 
9 weeks ago by mjtsai
Twitter
ABI design work started early, but we didn't expect the CPU change so we were trying to solve difficult compatibility problems. Then i386 jumped from "backburner project that is kept limping along" to "ships in $smallnum months" and we didn't have time to finish the ABI for it.

— Greg Parker (@gparker) December 5, 2019
FavoriteTweet  gparker 
10 weeks ago by mjtsai
Twitter
The Objective-C runtime ABI transition was simultaneous with a CPU change for outside developers, but not for Apple's own developers. iPhoneOS 1.0 shipped with the old runtime. Getting the new runtime in place before the App Store opened was an uncomfortably tight schedule.

— Greg Parker (@gparker) December 5, 2019
FavoriteTweet  gparker 
10 weeks ago by mjtsai
Twitter
At the OS performance level it is desirable to use it very widely. Each piece of unused dynamism is cheap, but those costs add up when multiplied by a few million.

— Greg Parker (@gparker) November 22, 2019
FavoriteTweet  gparker 
12 weeks ago by mjtsai
Twitter
Can confirm, the debugging session is awful after you remove objc_msgSend() and thereby break +initialize or lazy class realization. I did it at least twice during experiments.

This is a reason to keep very old feature requests alive: you can record lessons for future attempts.

— Greg Parker (@gparker) November 21, 2019
FavoriteTweet  gparker 
november 2019 by mjtsai
Twitter
The “direct” idea is even older than that Radar number implies. I am told that there was once a prototype implementation way back at NeXT.

— Greg Parker (@gparker) November 20, 2019
FavoriteTweet  gparker 
november 2019 by mjtsai
Twitter
Counterargument: the alternative to get this level of performance is to rewrite your method as a C function. That experience is awful in practice. It's important to be able to tune dynamism vs performance without busy-work syntax changes.

— Greg Parker (@gparker) November 19, 2019
FavoriteTweet  gparker 
november 2019 by mjtsai
Twitter
It's been discussed for decades (it's much older than that Radar number implies). I'm not sure it helps with anything Swift; my guess is that it was found to be a sufficiently high-value optimization for existing ObjC code that won't be rewritten any time soon.

— Greg Parker (@gparker) November 19, 2019
FavoriteTweet  gparker 
november 2019 by mjtsai
Twitter
tl;dr: Thou shalt not call objc_msgSend() without a cast to the correct function pointer type. https://t.co/mtZHsPJupJ

— Greg Parker (@gparker) October 11, 2019
FavoriteTweet  gparker 
october 2019 by mjtsai
Twitter
The name of the existing file is mandatory. The name of the new link is optional (by default it uses the existing file's name and the current working directory). Therefore the existing file comes first.

— Greg Parker (@gparker) October 6, 2019
FavoriteTweet  gparker 
october 2019 by mjtsai
Twitter
There are several places where the runtime enforces a bound on a data structure traversal to catch cycles introduced by bugs or memory corruption. (Here the superclass chain is bounded by the count of classes registered.) A crash is far better than a power-draining infinite loop.

— Greg Parker (@gparker) August 13, 2019
FavoriteTweet  gparker 
august 2019 by mjtsai
Twitter
The description of -retainArguments does mention it ("If a returnvalue has been set, this is also retained or copied") but it may need to be added elsewhere too.

— Greg Parker (@gparker) April 15, 2019
FavoriteTweet  gparker 
april 2019 by mjtsai
Twitter
This feature is one of the reasons that Apple created Swift instead of adopting an existing language. We needed at least as much capability to evolve libraries as Objective-C provided. https://t.co/RzQRyaKwD1

— Greg Parker (@gparker) April 14, 2019
FavoriteTweet  gparker 
april 2019 by mjtsai
Twitter
NSDate.distantFuture is something like January 1st 4001 AD, so other things are likely to break before reaching this Y12K problem.

— Greg Parker (@gparker) March 5, 2019
FavoriteTweet  gparker 
march 2019 by mjtsai
Twitter
Only indirectly. The implementation pre-dates Swift. But behind the scenes the idea that later became Swift was an important driver to get management to commit the resources necessary to build and deploy ObjC ARC.

— Greg Parker (@gparker) February 23, 2019
FavoriteTweet  gparker 
february 2019 by mjtsai
Twitter
You can forward these to reportphishing@apple.com. (Use "Message > Forward as Attachment" to capture the header information too.)https://t.co/73etoxJBI2

— Greg Parker (@gparker) February 15, 2019
FavoriteTweet  gparker 
february 2019 by mjtsai
Twitter
Can confirm, I once tracked down a thread race in the Java VM by adding sleep statements to the implementation.

— Greg Parker (@gparker) February 14, 2019
FavoriteTweet  gparker 
february 2019 by mjtsai
Twitter
…unless iOS 10 was your minimum deployment target. Then neither version-based checking nor automatic weak-import checking would have worked. Both of them would have disabled themselves because iOS 10 was new enough. Only hand-written NSClassFromString() could have succeeded.

— Greg Parker (@gparker) February 5, 2019
FavoriteTweet  gparker 
february 2019 by mjtsai
Twitter
Perfect software is hard. Imperfect software is useful. The correct trade-off is often to write and deliver imperfect software to more people faster. Capitalism chooses those trade-offs using dollar signs, but that doesn't make those decisions necessarily wrong.

— Greg Parker (@gparker) February 1, 2019
FavoriteTweet  gparker 
february 2019 by mjtsai
Twitter
You can't use this to pose as a class: the hook is only called if the class is not already known to exist. It's intended for Swift to register some of its classes on demand, such as instantiations of Swift generics, that the ObjC runtime can't see up front.

— Greg Parker (@gparker) January 26, 2019
FavoriteTweet  gparker 
january 2019 by mjtsai
Twitter
System 6 requires you to press and hold the mouse button to use menus. This is the most frustrating muscle memory break in the world. (source: I have an on-again off-again toy project for which I use System 6 and System 7 emulators.)

— Greg Parker (@gparker) January 25, 2019
FavoriteTweet  gparker 
january 2019 by mjtsai
Twitter
I don’t know if dlopen’ing an MH_EXECUTE file is formally supported. But yes, only exported symbols are ever found by dlsym() and by default executables are stripped too much for that.

— Greg Parker (@gparker) January 11, 2019
FavoriteTweet  gparker 
january 2019 by mjtsai
Twitter
Right, weak import doesn't solve that problem. Your ideas of either the -u linker flag or some macro wrapper or C++ wrapper around NSClassFromString are the only solutions I know of.

— Greg Parker (@gparker) December 26, 2018
FavoriteTweet  gparker 
december 2018 by mjtsai
Twitter
I joined Apple in 2001, a few months after Mac OS X 10.0 shipped and a few months before the iPod was announced.

— Greg Parker (@gparker) December 22, 2018
FavoriteTweet  gparker 
december 2018 by mjtsai
Twitter
[gparker release];

Today is my last day at Apple. It’s been fun.

— Greg Parker (@gparker) December 21, 2018
FavoriteTweet  gparker 
december 2018 by mjtsai
Twitter
hate: the testing machinery used for llvm and clang and swift prints "XFAIL:" for a test that succeeds due to an expected failure, which means you can't simply search for "FAIL:" to find the true failures.

— Greg Parker (@gparker) December 13, 2018
FavoriteTweet  gparker 
december 2018 by mjtsai
Twitter
TFW you're trying to introduce a specific bug to verify that a new test catches that bug, and it's not working because other assertions in the code keep catching the bug first.

— Greg Parker (@gparker) November 13, 2018
FavoriteTweet  gparker 
november 2018 by mjtsai
Twitter
/me opens the Swift team's internal chat

"@thin metatypes are zero-sized, yes"
"it's the thinnest metatype we've ever released"

Friday. Definitely Friday.

— Greg Parker (@gparker) October 27, 2018
FavoriteTweet  gparker 
october 2018 by mjtsai
Twitter
In theoretical practice objc_allocateClassPair() rejects duplicates. In practical practice there is a race where two simultaneous attempts to create a class with the same name may both succeed.

— Greg Parker (@gparker) October 24, 2018
FavoriteTweet  gparker 
october 2018 by mjtsai
Twitter
VM swap also quickly burns through SSD write cycles. I know that was a strike against swap back in the day; I assume it would still be a problem now.

— Greg Parker (@gparker) October 18, 2018
FavoriteTweet  gparker 
october 2018 by mjtsai
Twitter
Note to authors of cross-platform libraries: this setting exists and you should honor it. pic.twitter.com/sUsOZVysDY

— Greg Parker (@gparker) October 13, 2018
FavoriteTweet  gparker 
october 2018 by mjtsai
Twitter
More precisely: ARMv8.3 adds a new float-to-int instruction with errors and out-of-range values handled the way that JavaScript wants. The previous insns to get JavaScript's semantics were much slower. JavaScript's numbers are double by default so it needs this conversion a lot.

— Greg Parker (@gparker) October 2, 2018
FavoriteTweet  gparker 
october 2018 by mjtsai
Twitter
TN2151 lists a few more (see the "SIGKILL" and "Other Exception Types" sections), although it doesn't give any specific limit values. https://t.co/fCQ6OPsOaX

— Greg Parker (@gparker) September 24, 2018
FavoriteTweet  gparker 
september 2018 by mjtsai
Twitter
Dear app developer: Your tab-based interface sucks. ⌘W is for windows. pic.twitter.com/yIlWA6oQiM

— Greg Parker (@gparker) September 15, 2018
FavoriteTweet  gparker 
september 2018 by mjtsai
Twitter
I'm still annoyed that my fancy new representation for tagged NSDate objects isn't in Mojave. (It was probably-inadvertently dropped during some schedule reshuffling. If I had noticed that I would have advocated for its reinstatement.)

— Greg Parker (@gparker) September 11, 2018
FavoriteTweet  gparker 
september 2018 by mjtsai
Twitter
Probably hurts memory size too much. CF refcounting uses an inline retain count everywhere. IIRC 64-bit CF objects can't use ObjC non-pointer isa so they would be forced to use an out-of-line ObjC refcount, and 32-bit ObjC refcount is always out of line.

— Greg Parker (@gparker) September 3, 2018
FavoriteTweet  gparker 
september 2018 by mjtsai
Twitter
A definition of deprecated: when a test fails, you disable the test.

I'm pretty sure this failure is a problem in the test itself—its expected output changed everywhere except 32-bit Mac—but 32-bit Mac is dead enough that I'm not going to spend any time fixing the test.

— Greg Parker (@gparker) August 27, 2018
FavoriteTweet  gparker 
august 2018 by mjtsai
Twitter
The test file for objc_msgSend itself is simultaneously so great and so awful. With luck I'll delete this line today. pic.twitter.com/P9vLFI4Aat

— Greg Parker (@gparker) August 21, 2018
FavoriteTweet  gparker 
august 2018 by mjtsai
Twitter
Right. In the new ABI we wanted to hide the implementation of superclass lookup from the generated code. objc_msgSendSuper() requires the caller to look up the superclass. objc_msgSendSuper2() performs that superclass lookup for you.

— Greg Parker (@gparker) August 12, 2018
FavoriteTweet  gparker 
august 2018 by mjtsai
Twitter
What exactly is the problem? Closing the file descriptor before the cleanup handler begins is too early?

— Greg Parker (@gparker) August 8, 2018
FavoriteTweet  gparker 
august 2018 by mjtsai
Twitter
Does the compiler actually do anything with attribute(cold) today?

— Greg Parker (@gparker) July 10, 2018
FavoriteTweet  gparker 
july 2018 by mjtsai
Twitter
Example: if you have a view-style tree structure then the subview-to-superview references can be unowned. You "know" that the superview will live at least as long as its subviews.

— Greg Parker (@gparker) July 9, 2018
FavoriteTweet  gparker 
july 2018 by mjtsai
Twitter
You may be able to use unowned instead of weak. Unowned is faster than weak. Use unowned when you want circular references but "know" that the pointed-to object will not be deallocated first.

— Greg Parker (@gparker) July 9, 2018
FavoriteTweet  gparker 
july 2018 by mjtsai
Twitter
That's right. If an object is or has ever been weakly referenced then its retain/release operations will be slower.

— Greg Parker (@gparker) July 9, 2018
FavoriteTweet  gparker 
july 2018 by mjtsai
Twitter
Sounds frighteningly risky. A more likely workaround here would be to add a do-nothing -release implementation upon finding that class name and app ID and app version.

— Greg Parker (@gparker) July 7, 2018
FavoriteTweet  gparker 
july 2018 by mjtsai
Twitter
Today in why binary compatibility is impossible: App's singleton class overrides -retain and -autorelease with no-op methods but fails to override -release. Old OS happened to call retain/autorelease, which worked. New OS now calls retain/release, which deallocates the singleton.

— Greg Parker (@gparker) July 7, 2018
FavoriteTweet  gparker 
july 2018 by mjtsai
Twitter
Modes, and observers, and re-entrancy, and the integration between the main run loop and dispatch queues. But that's mostly straightforward elaboration once you get the concept. (Except the dispatch queue stuff: that is in fact incomprehensible.)

— Greg Parker (@gparker) June 27, 2018
FavoriteTweet  gparker 
june 2018 by mjtsai
Twitter
The C standard goes to a lot of trouble to allow null pointers whose storage has a bit pattern other than zero, so there must be at least one old system out there that does something like this.

— Greg Parker (@gparker) June 22, 2018
FavoriteTweet  gparker 
june 2018 by mjtsai
Twitter
Not mentioned in WWDC 2018 session 414: another malloc free list signature is a bad address 0x…bead; 0x…bec0 and 0x…bec8 are common in objc_msgSend due to masking and offsets. That value is a remnant of the malloc free list encoding by the nanozone allocator on some platforms.

— Greg Parker (@gparker) June 21, 2018
FavoriteTweet  gparker 
june 2018 by mjtsai
Twitter
As seen in WWDC 2018 session 414: a crash with a bad address that looks like a valid heap address rotated right 4 bits is a sign of use after free. That 4 bit rotate is an encoding of the malloc free list.https://t.co/NJ0QHkBfaP

— Greg Parker (@gparker) June 21, 2018
FavoriteTweet  gparker 
june 2018 by mjtsai
Twitter
Why are internet video ads so poorly optimized for internet video? You have five seconds before I can click the "skip ad" button. Perhaps you should show your brand name and product in that time?

— Greg Parker (@gparker) June 11, 2018
FavoriteTweet  gparker 
june 2018 by mjtsai
Twitter
A regression that is bad but not terribly so has a relatively narrow window to be found if it is going to be fixed for GM. If it is not found now then it may be too low-priority or high-risk to merit inclusion in an update. (3/3)

— Greg Parker (@gparker) June 11, 2018
FavoriteTweet  gparker 
june 2018 by mjtsai
Twitter
This window is unimportant for severe or minor bugs. Severe bugs can be high priority for any update. Minor bugs are likely to be deferred to next year anyway. It is the moderate bugs and specifically moderate regressions for which the early beta period is most important. (2/3)

— Greg Parker (@gparker) June 11, 2018
FavoriteTweet  gparker 
june 2018 by mjtsai
Twitter
It's not true. (1/3)

— Greg Parker (@gparker) June 11, 2018
FavoriteTweet  gparker 
june 2018 by mjtsai
Twitter
Cocoa. Its API was designed around Objective-C's method call syntax. The history of Cocoa bridges to other languages is syntactically dissatisfying. It took months to design Swift's function call and declaration syntax around it, even with the advantage of starting from scratch.

— Greg Parker (@gparker) June 11, 2018
FavoriteTweet  gparker 
june 2018 by mjtsai
Greg Parker on Twitter: "ObjC went with storing isa and retain count in a single word, but another design was to get allocator cooperation for an extra word before the "base" of the allocation and store the retain count there.… https://t.co/OMUaczuBCm"
ObjC went with storing isa and retain count in a single word, but another design was to get allocator cooperation for an extra word before the "base" of the allocation and store the retain count there.

— Greg Parker (@gparker) May 17, 2018
FavoriteTweet  gparker 
may 2018 by mjtsai
Greg Parker on Twitter: "Early Unix named some of their C struct fields as if it were true, giving us names like struct sockaddr_un.sun_family and struct https://t.co/hG05ehTB3J_size. (Was that some group's style guideline? Some person's individual prefer
Early Unix named some of their C struct fields as if it were true, giving us names like struct sockaddr_un.sun_family and struct https://t.co/hG05ehTB3J_size. (Was that some group's style guideline? Some person's individual preference?)

— Greg Parker (@gparker) April 29, 2018
FavoriteTweet  gparker 
april 2018 by mjtsai
Greg Parker on Twitter: "Back on PowerPC the Objective-C method cache hash function for selectors was originally a simple mask of the low bits—but the selector cstrings were 4-byte aligned by the compiler so 3/4 of the hash buckets went unused until the
Back on PowerPC the Objective-C method cache hash function for selectors was originally a simple mask of the low bits—but the selector cstrings were 4-byte aligned by the compiler so 3/4 of the hash buckets went unused until there were collisions.

— Greg Parker (@gparker) April 15, 2018
FavoriteTweet  gparker 
april 2018 by mjtsai
Greg Parker on Twitter: "Haven’t tried this on recent OS versions. I should check if it needs any updates. https://t.co/zcw3tDPXkh… "
Haven’t tried this on recent OS versions. I should check if it needs any updates. https://t.co/zcw3tDPXkh

— Greg Parker (@gparker) April 9, 2018
FavoriteTweet  gparker 
april 2018 by mjtsai
Greg Parker on Twitter: "libobjc's tests would ordinarily have caught that. The first tests were introduced around the time that the legacy API was replaced, so many legacy-only functions never had tests written."
libobjc's tests would ordinarily have caught that. The first tests were introduced around the time that the legacy API was replaced, so many legacy-only functions never had tests written.

— Greg Parker (@gparker) March 31, 2018
FavoriteTweet  gparker 
march 2018 by mjtsai
Greg Parker on Twitter: "TIL that the legacy (32-bit Mac only) ObjC function method_getArgumentInfo() was accidentally made private in macOS 10.9. Nobody noticed, or at least nobody cared enough to complain."
TIL that the legacy (32-bit Mac only) ObjC function method_getArgumentInfo() was accidentally made private in macOS 10.9. Nobody noticed, or at least nobody cared enough to complain.

— Greg Parker (@gparker) March 31, 2018
FavoriteTweet  gparker 
march 2018 by mjtsai
Greg Parker on Twitter: "Another possibility that @ameaijou is probably remembering: if F's code is in a static archive at some point in its build then it is possible for the category implementations to be omitted from the built framework. The -ObjC or -f
Another possibility that @ameaijou is probably remembering: if F's code is in a static archive at some point in its build then it is possible for the category implementations to be omitted from the built framework. The -ObjC or -force_load linker flags can fix that.

— Greg Parker (@gparker) February 7, 2018
FavoriteTweet  gparker 
february 2018 by mjtsai
Greg Parker on Twitter: "I have seen many alternate spellings of "class" in runtime implementations in order to avoid collisions with the C++ keyword, but that is a new one.… https://t.co/HG0SFO8jbu"
I have seen many alternate spellings of "class" in runtime implementations in order to avoid collisions with the C++ keyword, but that is a new one.

— Greg Parker (@gparker) February 1, 2018
FavoriteTweet  gparker 
february 2018 by mjtsai
Greg Parker on Twitter: "(IIRC the admin needs to opt-in to allow creating new topics via email, but otherwise you should be able to read and reply.)… "
(IIRC the admin needs to opt-in to allow creating new topics via email, but otherwise you should be able to read and reply.)

— Greg Parker (@gparker) January 28, 2018
FavoriteTweet  gparker 
january 2018 by mjtsai
Greg Parker on Twitter: "There's a bug. An object's unowned count can increase during deinit. On 32-bit that can overflow, provoking creation of a side table entry for the object. But this chart had no transition from deiniting-without-side-table to deini
There's a bug. An object's unowned count can increase during deinit. On 32-bit that can overflow, provoking creation of a side table entry for the object. But this chart had no transition from deiniting-without-side-table to deiniting-with-side-table. I'll make @mikeash fix it. pic.twitter.com/2fX0C4NAIE

— Greg Parker (@gparker) January 18, 2018
FavoriteTweet  gparker 
january 2018 by mjtsai
Greg Parker on Twitter: "@iljawascoding There was a change in 10.12. It's tied to the -stronglyReferencesItems property. The -isEqual: effect is mentioned in old release notes but… https://t.co/yAmkHrzWaV"
There was a change in 10.12. It's tied to the -stronglyReferencesItems property. The -isEqual: effect is mentioned in old release notes but not the current documentation. You should file a bug report about that.

"NSOutlineView can now use isEqual: …"https://t.co/SuzQjmZfMa

— Greg Parker (@gparker) January 16, 2018
FavoriteTweet  gparker 
january 2018 by mjtsai
Greg Parker on Twitter: "I never played Meltdown, but Spectre was a fun game back in the day."
I never played Meltdown, but Spectre was a fun game back in the day.

— Greg Parker (@gparker) January 12, 2018
FavoriteTweet  gparker 
january 2018 by mjtsai
Greg Parker on Twitter: "@pathofshrines @Catfish_Man @gte @UINT_MIN @slava_pestov @whitequark @pcwalton (The improvement: have the non-ARC compiler emit calls to objc_retain() like the ARC compiler does. objc_retain() performs the fast path che… https:/
(The improvement: have the non-ARC compiler emit calls to objc_retain() like the ARC compiler does. objc_retain() performs the fast path check. The problem: the ARC optimizer will rearrange calls to objc_retain() even when ARC is off.)

— Greg Parker (@gparker) November 14, 2017
FavoriteTweet  gparker 
november 2017 by mjtsai
Greg Parker on Twitter: "@NSExceptional @slava_pestov @jckarter Note that the stable ABI will also have its own root class, with a name that is not "SwiftObject"."
Note that the stable ABI will also have its own root class, with a name that is not "SwiftObject".

— Greg Parker (@gparker) October 29, 2017
FavoriteTweet  gparker 
october 2017 by mjtsai
Greg Parker on Twitter: "I assume real compiler engineers know better techniques but whenever my compiler changes don't work I debug them with fprintf() and abort()."
I assume real compiler engineers know better techniques but whenever my compiler changes don't work I debug them with fprintf() and abort().

— Greg Parker (@gparker) October 25, 2017
FavoriteTweet  gparker 
october 2017 by mjtsai
Greg Parker on Twitter: "@simX @zadr Unfortunately not so simple. How often was the bug blamed on "I typed it wrong", or the wrong answer unwittingly accepted?"
Unfortunately not so simple. How often was the bug blamed on "I typed it wrong", or the wrong answer unwittingly accepted?

— Greg Parker (@gparker) October 24, 2017
FavoriteTweet  gparker 
october 2017 by mjtsai
Greg Parker on Twitter: "@pedantcoder @cipherCOM clang in Xcode 9 has this. It's possible that it is not supported for Objective-C methods; if you find something missing please file a bug r… https://t.co/91PHpQ32uh"
clang in Xcode 9 has this. It's possible that it is not supported for Objective-C methods; if you find something missing please file a bug report.

— Greg Parker (@gparker) October 17, 2017
FavoriteTweet  gparker 
october 2017 by mjtsai
Greg Parker on Twitter: "@stroughtonsmith @mjtsai @wilshipley Don't hold your breath. I expect Objective-C will remain the right tool for some jobs for a long time."
Don't hold your breath. I expect Objective-C will remain the right tool for some jobs for a long time.

— Greg Parker (@gparker) October 6, 2017
FavoriteTweet  gparker 
october 2017 by mjtsai
« earlier      
per page:    204080120160

Copy this bookmark:



description:


tags: