Archive for the ‘Iphone’ tag
My Career – A year look back and fro
It has been almost one year from my first day into my career (4/11) and since that day I have learnt a lot of things and sharing lots of things in my blog, stackoverflow, facebook and twitter. I will try to summarize and make a general view for my career in the last year. I will also give out my vision for my career for the next year
Web Development
My first work is Scala researching – a still hot technology and growing quickly until now.
Although currently, I do not work much in Web Development, but I will try, for sure, come back to this field again. Why? My vision about this field is still hot, highest and most challenging technology for scalable system is still here with the born of lots of things like Cloud Computing, Google App Engine, Scala, Ruby and Clojure. Maybe my next programming language for the web is Ruby. I already have the intention to jump into here. Hope that my colleagues in KMS can help me to catch up this technology fast.
The good thing about Web Development now is that we have Google App Engine and some App Store for the web is growing. With the born of Cloud OS which will happen soon, I hope that I will have the time and chance to come back, either individually or as a developer in the company.
Artificial Intelligence
This area is cool by its name and it is part of a reason I went to Melbourne last year. I had chance to work full time on it and even it was not a success, I learnt a lot from it. What I think is that I will try to focus on Computer Vision and Machine Learning (and may be Agent system) with the intention to apply them into iPhone someday. Why is iPhone? Because I still need to do something with commercial purpose and dealing with iPhone will at least give me some financial benefit in short term. And with iPhone and client technology, I don’t have to deal with massive amount of database problem which I have no chance to practice.
Related to Artificial Intelligence, I intended to take Phd from years ago. However, my decision now is something industry oriented rather than academic environment. I appreciate the academic environment, which is good to work and learn what you like but for now, I think I do not prefer it.
Mobile Development
I came to this area by luck, I didn’t really intend to jump into. iPhone programming is cool by its design, working in limited environment and dealing with memory management. There is another challenge for building iPhone app for me is how to make it the best for user, in other terms, usability.
I learnt lots of things about usability over last few months after reading some books: “Don’t make me think” and “User Interaction Design”. This viewpoint is a little bit from a designer’s perspective rather than a developer’s one. This is cool and make me understand more about users. To be honest, before I do iphone development, I am scared of designing (both in terms of graphics and interaction) and I don’t get love in it. But now, I think I can do at least interaction design well. The usability lession is a first and perfect one for overcoming scareness in my career.
Other stuff
Working in iPhone let me have time to learn something else that I am scared about. Git in terminal for example. I am scared of terminal and scripting and all those administration stuff before.
I am also trying to do a lot of testing in iPhone, from UI Automation Testing to Unit Testing which make me fall in love. I love the Google Testing Blog’s Term: “If it ain’t broke, you’re not trying hard enough”. Now, I feel so bad for anytime I cannot make a software crashed
. It is also good that I am still looking forward to improving my productivity day by day, automation process, hot keys and dual monitor was what I achieved. The next stuff will be emacs, for example.
My current love in technology can be said: “user, automate and scale”.
PS: To be honest, I hope that this is the first time I can focus 150% into working and researching. For the whole last year, I had to spend so much time in university assignments, exams and then GRE. Those things do not just take off my time but also kill my energy and passion so fast, while those things are either not challenging, boring or just I do not love it.
Become Master of XCode (part 2)
I recommend you to have some few experience with XCode before trying to touch some of the techniques here, especially code generation because it may contain subtle bugs and if you are just a newbie, it is not easy to solve. You may also want to take a look at my first part: Become Master of XCode
Many of the techniques are learnt from “Becoming productive in XCode”
3/ Code Generation Scripting
The most common and boring problem that iPhone developers usually have is writing again and again: private instance variable, @property, @synthesize and then dealloc. It is not just boring but also easy to make mistake. Currently, I found that there is a useful way for developers to generate all @property, @synthesize and dealloc based on the instance variable.
Go into User Script, create your own group and script name:
Copy the script from Github (thanks to AllanCraig) and put into. Don’t forget your hot key to trigger the code generation. You may also need to configure the script a little bit to fit your own purpose and coding convention
4/ Code Template (Text Macros)
They have 2 main kinds of code templates: the built in text macros and your text macros:
a/ Default Text Macros:
Xcode already includes lots of text macros like: init, dealloc, fore (for each), fori (normal for loop over array). See a long list in XCode Completion Macros.
Here is the path for the built in Text Macros:
/Developer/Applications/Xcode.app/Contents/PlugIns/TextMacros.xctxtmacro /Content/Resources/
b/ Your own Text Macros:
You can put more Text Macros into Xcode by understanding and writing the Text Macros yourself. The file location for your Text Macros is: ~/Library/Application Support/Developer/Support/Xcode/Specifications
Here are some samples Text Macros that I will work through to get you the feeling of the Text Macros. I hope that after I exlain it, you can create your own.
{
Identifier = objc.dealloc;
BasedOn = objc;
IsMenuItem = YES;
Name = "Dealloc Method Definition";
TextString = "- (void) dealloc$(BlockSeparator){nt<#!deallocations!#>
nt[super dealloc];n}n";
CompletionPrefix = dealloc;
}
Identifier : the id of your method
BasedOn : the programming language of your macro. Here is objc
Name : a descriptive name
Text String: the text string will replace your Macros:
${BlockSeparator} : the way you specify the spaces in your code, you can configure it through terminal and script
<#!deallocations!#> : a placeholder with the text deallocations.
[super dealloc]; : the text appears in your macros
5/ File and Project Templates
You can change your file and project templates, there is not much to say here. You have a built in project and file templates in:
/Developer/Platforms/iphoneOS.platform/Developer/Library/Xcode/Project Templates /Developer/Platforms/iphoneOS.platform/Developer/Library/Xcode/File Templates
But you should create your own file and project templates in:
~/Library/Application Support/Developer/Shared/Xcode/Project Templates ~/Library/Application Support/Developer/Shared/Xcode/File Templates
You may want to copy some from the default templates and modify. The reason that you should put in your own folder is that if Xcode is upgraded, it will not delete your modification
6/ Debugging Techniques
You should also add these 2 breakpoints so that XCode will stop at the crash point when exception happens. You can add breakpoints either via command line:
gdb fb -[NSException raise] fb objc_exception_throw
Or you can also add them using the XCode as shown in stackoverflow
by adding “-[NSException raise]” and “objc_exception_throw” as in the below figure. You should double check the result as well:
Reference:
Hidden XCode build and debug template
iPhone App Performance Optimization
Working in a power limited environment like mobile, and especially, iPhone here, we soon have to face with performance problem in many different kinds. Different than the web model where web front end (javascript) do some (usually not much) processing – also browsers support you a lot, iPhone native application usually has to do quite a lot of processing.
For iPhone native app, you cannot add any hardware to help you to have better performance. The only way you can try to deal is to deal with the software code itself. I will list some few problems and solutions that I figure out these days when I really focus on optimization. The list is applicable somehow to other mobile areas like Android or limited environment like embedded device
1/ Benchmark
It is a really traditional advice, but you always have to remember to benchmark your code, even by using simple tools like NSLog or Instrument tool. You should only care about places that is slow in terms of your test rather than trying guess and error possible places.
2/ Test on iPhone device
This is another traditional advice but people usually forget. You have to test on the real iPhone device. Let me give you an example: on my iPhone simulator, a method runs within 1 second, but in my iPhone device, it takes 8 seconds, a huge difference.
So, when you test your app on the iPhone device, don’t just test for UI, memory or features that the simulator doesn’t have. Remember testing the performance as well.
3/ Multithreading and the main thread
Some people may come to you and tell you that iPhone device just has 1 core and you never need to care about multithreading. It is just WRONG. You still need to do a lot of multithreading to reach a better level of performance.
The main thread will do the user touch event handler and view rendering. Then, if you use the main thread for some calculation that takes a lot of time then your UI just become frozen or not smooth when you scroll.
For UI like UITableView where users scroll between many cells, the runtime will run a loop over visible cells and set the contents. Because this process runs in a row not concurrently, and it will not allow you to view or scroll the UITableView until it returns all cells, you can possibly let some of the cell content run on another thread. (more about performance on UITableViewCell part).
The other reasons for using thread are well-known, heavy IO and network processing, all of them block processing and you need thread so that your main thread is not block. This will help to make users feel your app run with higher performance
But, be CAREFUL, Multithreading comes with its own disadvantages. For rendering the view, you should do it on the main thread or somtimes, your app will just crash randomly. Another traditional reason is that the CPU has to switch too much between threads and it takes more time than usual to finish a task
4/ Use Memory wisely
Some questions on stackoverflow that I sometimes see shows a scare feeling about memory. It is right that iPhone has limited memory but it doesn’t necessarily mean that you should use it as least as you can. Memory and Performance is always a trade-off problem, you must use it smartly
The right mind you need to keep is using that limited memory smartly. We all know the priority of speed is Memory > File and Local IO > Network, the fastest access is always using memory cache for the data. There are some problems for memory caching in iPhone:
- – You have to respond to 1 method in every UIViewController: (void)didReceiveMemoryWarning. In this method, you have to smartly release some memory cache of data to reduce your memory usage.- Know what/when to cache something in memory. There are lots of Caching algorithms outside from simplest ones like: Random Replacement, Least Recently Used, Most Recently Used. It is also an issue of caching big images or caching lots of small images. It all depends on your app. For my app, my main view contains lots of thumbnail images that need displaying fast and the user can wait for seeing big images. So, we cache a lot of images (60-100) for just 2 MB of memory. Knowing how to balance memory usage and good performance will help you a lot
5/ Algorithms and Data Structure
For my case, I didn’t really need to solve big performance issue with Algorithm and Data Structure, but in a limited environment, a small mistake may lead to a big deal and hard to detect. My case was that I need to merge 2 data arrays from the network using some unique characteristics of elements.
The app works really well in the Simulator for about 50-100 for each array (less than 0.5 second) . However, when I tested on the device, the time surprised me, 8 seconds (16 times slower). It cost me 1 hour to detect that I use 2 for loops through 2 arrays which means O(n2), and then, I changed it to a dictionary which reduced the algorithm to O(n) and took me back to 1 second. Phew! Finally, performance is up now
What I learnt here is that even we don’t ever need to deal with Massive Data, we still need to be careful about some algorithm and data structure. 50 elements are nothing in a desktop or server scale but can cause a huge issue on limited environments in iPhone. Another lesson is a remind for me that I should always test on the real device to get the real performance
6/ Reuse UITableViewCell to improve Scrolling Performance
This part is quite unique for iPhone but may be good for other people to learn. In iPhone, we have a concept of UITableView for displaying a list and a table can contain a lot of cell.
The problem is that rendering the Cell (or generally the UIView), takes lots of time and can cause the app to look like stuck when it is scrolling. Usually, if you use the default UITableViewController template, the template already gives you the code for reusing the UITableViewCell.
The only problem is when you create a custom UITableViewCell using some usual tutorials like this and this (especially using Interface Builder), they forget to tell you that setting a CellIdentifer in the UITableView is not enough to reuse a cell. What you need to do is to set it in InterfaceBuilder or write a method to return it. I know that many people will forget it and think that they still reuse the cell, but they don’t. I suffer the same problem until I did benchmark and found the problem recently.
Here are 2 good techniques:
Copied from Stackoverflow, this question:
1st way: Just implement a method with the appropriate method signature:
- (NSString *) reuseIdentifier {
return @"myIdentifier";
}
2nd way:

Cell Reuse in IB
References:
2/ Web Caching, Stanley Luong’s course material
3/ Stackoverflow – reuseable Cell
4/ Stackoverflow – custom UITableViewCell
Become Master of Xcode
For iPhone development guys (and Mac as well), we all want to be as productive as possible. And one of our important tools is Xcode. I can even say that if we can master of Xcode, we can double our productivity. The reason is not only the time that the tool can save us but the number of times it breaks our workflow, or make us become bored/tired of our jobs. We are all humans, and no human in the world wants to do the job that a machine can do. Ok, stop talking and I will show you my summary of tips/tricks and techniques that I feel very very useful for me.
Many of these tips is from this stackoverflow post (I just list what I feel is most productive), 2 famous videos called “Becoming productive in XCode”, and a famous cheat sheet that almost all of us know “Complete Xcode Keyboard Shortcut List”
I also recommend you to go there and take a look because this post may be really personal and lack excellent tips that you want.
1/ Basic Hot Keys
File Cursor Movement
- Header/Source File Switching: Option + Command + Up Arrow
- Last cursor point switch back and forward: Option + Command + Left (Right) Arrow
Quick Help/Documentation
- Jump to Definition of a symbol : Command + Double-Click on a symbol
- Find Text in Documentation of a symbol: Option + Double-Click on a symbol: (Only works if you have they symbol’s Doc Set installed.)
Auto Complete
- (previous) next auto-completion argument : (Shift) + Control + /
- Auto completion pop-up list : Escape or Control + comma
- (previous) next Auto completion choices movement: (Shift) + Control + period
Text Movement:
- Cursor movement between words : Option + Left (Right) Arrow
- Cursor movement camel-cased parts of a word: Control + Left (Right) Arrow
- Beginning or end of line: Command + Left (Right) Arrow
Interface Builder:
- Jump to class in Xcode : Command + Double-click on an object in Interface Builder’s
- Drag a customized object back to Interface Builder’s Library for later reuse.
- Object overlap, see object menu under mouse: Control + Shift + Click on an object :
Code Organizing:
- Bold line in the function list: #pragma mark Foo
- Auto complete the pragma: pm or #p
- Notation convention: // TODO: or // FixMe
- Commenting a line: Command + /
2/ Advanced Hot Keys
With advanced hot keys, you will rarely need to use the mouse. Because, everything you need to do with the mouse, you can do it with the hot keys.
- Open File Quickly : Command + Shift + D and don’t forget that open quickly uses the current word as a search term.
- Popup list of methods and symbols in the current file : Control + 2
- Look up current symbol: Control + Command + ?
- Editor area to full screen : Command + Shift + E
- Debug and Editor Mode switch in All-In-One XCode mode : Command + Shift + B
3/ Some useful scripting
I will tell you more about scripting in the next part, but currently, I think this list is basic enough:
Default Auto Completion list, show when you type
defaults write com.apple.Xcode XCCodeSenseAutoSuggestionStyle List
Turn Off Undo Warning
defaults write com.apple.Xcode XCShowUndoPastSaveWarning NO
Hope that now you can code iPhone app much faster with XCode
iPhone development tools
Working with Iphone development is working with OSX, and we always need good tools and software for both IPhone and OSX environment to boost our productivity and reducing the repetitive, boring jobs
1/ Multitouch, Accelerometer and more : ISimulate
An application allows you to use your real iphone to control the IPhone Simulator. There is nothing better than the real IPhone device to get the real user feeling. The reason is that it will save a lot of time for you when you only build on simulator, debugging on simulator and you have a wide screen to see.
2/ Memory static analyzer : Clang
Help you a lot in the managed memory environment of iphone development. Good news is that the new XCode (3.2) will integrate directly with Clang help you to analyze and find memory leak much faster.
You cannot write a good iphone app development without writing good unit testing. And I suggest you to use Google toolbox for Mac with a lot of supports, easy to integrate into your project. It is better than the default OCUnit in XCode. It also really runs your code, which takes more time, but gives you a real, better result and can help you to deal with some File IO or real code you need to run when running unit test.
4/ UI Automation Test: XCode Instrument
Stop running the UI everytime you fix a bug or adding new feature. UI Automation Instrument is a best tool for you like robot proxy in web testing.
5/ Screen capture software: Jing
Good, free software with high quality captured video. Good use for demo.
Why do I put a chat client here? Everybody need some way of communication, especially if some of your co-workers or clients are not there. In Mac, you can use Adium to integrate a lot of chatting services like Gmail, yahoo…



