{"id":9869,"date":"2014-10-14T20:16:30","date_gmt":"2014-10-15T00:16:30","guid":{"rendered":"http:\/\/mjtsai.com\/blog\/?p=9869"},"modified":"2014-10-14T20:16:30","modified_gmt":"2014-10-15T00:16:30","slug":"ios-app-postmortem","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2014\/10\/14\/ios-app-postmortem\/","title":{"rendered":"iOS App Postmortem"},"content":{"rendered":"<p><a href=\"http:\/\/www.mulle-kybernetik.com\/weblog\/2014\/10\/dienstag-postmortem-since-my-f.html\">Nat!<\/a>:<\/p>\n<blockquote cite=\"http:\/\/www.mulle-kybernetik.com\/weblog\/2014\/10\/dienstag-postmortem-since-my-f.html\"><p>The project started out on iOS 5, which was quickly succeeded by iOS 6. I would have been extremely surprised at the beginning, if someone had told me, that at the time of iOS 8s release our app still wouldn&rsquo;t be done yet. But here is a recollection of all my faults: why it took way too long.<\/p><p>[&#8230;]<\/p><p>I bought <a href=\"http:\/\/www.jetbrains.com\/objc\/\">AppCode<\/a> solely to run &ldquo;Inspect Code&#8230;&rdquo;. The results returned are quite a bit more helpful than what Xcode Analyzer returns.<\/p><p>[&#8230;]<\/p><p>I probably wrote a hundred little apps, that tested out some feature, or started coding a subview with it. When the code was complete I moved it into the main app, deleted the original files and then symlinked the files from the main app in the test app. This way, I could go back to the test app to tweak something, when it didn&rsquo;t work out in the main app. Needless to say being able to focus on just a small piece of code in a controlled environment is much more convenient.<\/p><p>[&#8230;]<\/p><p>This unfortunately means, that I am almost invariably are going to hit a brick wall at some point in time. For example, I spent way, way more time dicking around with UIScrollView than I eventually needed to code my own custom UIScrollView. The opacity of the iOS libraries means, that I always have to guess, how it&rsquo;s really implemented, guess how it could break in the next iOS version and also guess beforehand, if everything is exposed like I will eventually need it.<\/p><p>[&#8230;]<\/p><p>Subclassing CoreData classes or overriding CoreData accessors is a path to misery, where I am unfortunately still traveling on. I am not 100% sure, but I would probably have been better off, either just going sqlite-direct or to use a stripped down MulleEOF for Dienstag.<\/p><p>[&#8230;]<\/p><p>It was interesting, because &ldquo;naive code&rdquo; only suffered a factor 2 ARC penalty, whereas &ldquo;clever code&rdquo; suffered a factor 10 ARC penalty. So ARC seems to be a great programmer equalizer in that respect. I didn&rsquo;t investigate other &ldquo;patterns&rdquo;, but I also continued not using ARC. Less magic, less pain.<\/p><\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Nat!: The project started out on iOS 5, which was quickly succeeded by iOS 6. I would have been extremely surprised at the beginning, if someone had told me, that at the time of iOS 8s release our app still wouldn&rsquo;t be done yet. But here is a recollection of all my faults: why it [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"","apple_news_api_id":"","apple_news_api_modified_at":"","apple_news_api_revision":"","apple_news_api_share_url":"","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[4],"tags":[1038,55,69,199,109,31,54,71],"class_list":["post-9869","post","type-post","status-publish","format-standard","hentry","category-programming-category","tag-appcode","tag-arc","tag-cocoa","tag-bindings","tag-coredata","tag-ios","tag-objective-c","tag-programming"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/9869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=9869"}],"version-history":[{"count":1,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/9869\/revisions"}],"predecessor-version":[{"id":9870,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/9869\/revisions\/9870"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=9869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=9869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=9869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}