2012年11月26日 星期一

Stanford iOS 開發課程 (CS193P) 教科書

最受歡迎的 Stanford iOS 開發課程 (CS193P) 教科書, 包含 Xcode 4.5 和 iOS 6。目前全球50國家免費下載。

iPad and iPhone App Development 教科書

MapReduce Design Patterns


  • Summarization patterns: get a top-level view by summarizing and grouping data
  • Filtering patterns: view data subsets such as records generated from one user
  • Data organization patterns: reorganize data to work with other systems, or to make MapReduce analysis easier
  • Join patterns: analyze different datasets together to discover interesting relationships
  • Metapatterns: piece together several patterns to solve multi-stage problems, or to perform several analytics in the same job
  • Input and output patterns: customize the way you use Hadoop to load or store data


2012年11月24日 星期六

Singleton Pattern

SingletonObject.h
#import <Foundation/Foundation.h>
@interface SingletonObject : NSObject {
@private
int count;
}

//統一透過此函式來使用 Singleton 物件的方法
+ (SingletonObject *)sharedSingletonObject;
//增加
- (void)addCount;
//呈現
- (void)showCount;
@end


  1. #import "SingletonObject.h"
  2.  
  3. @implementation SingletonObject
  4.  
  5. //宣告一個靜態的Singleton物件
  6. static SingletonObject *_singletonObject = nil;
  7.  
  8. - (id)init {
  9. self = [super init];
  10. if (self) {
  11.  
  12. //將 count 初始化為0
  13. count = 0;
  14. }
  15.  
  16. return self;
  17. }
  18.  
  19. //執行時會判斷是否 _singletonObject 已經完成記憶體配置
  20. + (SingletonObject *)sharedSingletonObject {
  21.  
  22. @synchronized([SingletonObject class]) {
  23.  
  24. //判斷_singletonObject是否完成記憶體配置
  25. if (!_singletonObject)
  26. [[self alloc] init];
  27.  
  28. return _singletonObject;
  29. }
  30.  
  31. return nil;
  32. }
  33.  
  34. + (id)alloc {
  35. @synchronized([SingletonObject class]) {
  36.  
  37. //避免 [SingletonObject alloc] 方法被濫用
  38. NSAssert(_singletonObject == nil, @"_singletonObject 已經做過記憶體配置");
  39. _singletonObject = [super alloc];
  40.  
  41. return _singletonObject;
  42. }
  43.  
  44. return nil;
  45. }
  46.  
  47. - (void)addCount {
  48. count += 1;
  49. }
  50.  
  51. - (void)showCount {
  52. NSLog(@"%d", count);
  53. }
  54.  
  55. - (void)dealloc {
  56. [super dealloc];
  57. }
  58.  
  59. @end

NSString 物件的操作方法

宣告與格式化
//建立字串物件
NSString *str = @"NSString";
//建立空字串
NSString *str =[[NSString alloc] init];
//與CString的轉換
char *cstring = "CString";
NSString *str = [[NSString alloc] initWithCString:cstring];
//字串格重新式化
NSString *str =[[NSString alloc] initWithString:@"NSString"];
str = [NSString stringWithFormat:@"This is %@", str];
NSLog(@"%@", str);


大小寫的轉換
//字串的大小寫轉換
NSString *str =[[NSString alloc] initWithString:@"NSString"];
//全部大寫
NSLog(@"%@",[str uppercaseString]);
//全部小寫
NSLog(@"%@",[str lowercaseString]);
//字首大寫
NSLog(@"%@", [str capitalizedString]);


在 iOS 6 SDK 中使用新的方法函式加入了 NSLocale 的概念,使裝置在不同的語系設定下皆可以正確的轉換這些字串。
//全部大寫
NSString *upperString = [string uppercaseStringWithLocale:[NSLocale currentLocale]];
NSLog(@"全部大寫: %@", upperString);
//全部小寫
NSString *lowerString = [string lowercaseStringWithLocale:[NSLocale currentLocale]];
NSLog(@"全部小寫: %@", lowerString);
//只有字首大寫
NSString *capString = [string capitalizedStringWithLocale:[NSLocale currentLocale]];
NSLog(@"只有字首大寫: %@", capString)


比較
//字串比較
NSString *str_A =[[NSString alloc] initWithString:@"NSString"];
NSString *str_B =[[NSString alloc] initWithString:@"nsstring"];
BOOL compare;

//字串區分大小寫比較
compare = [str_A isEqualToString:str_B];

//字串不區分大小寫比較
compare = [str_A caseInsensitiveCompare:str_B] == NSOrderedSame;


排序

NSString *string = @"0";
NSComparisonResult result = [string caseInsensitiveCompare:@"A"];

switch (result) {
case NSOrderedAscending:
NSLog(@"升冪");
break;

case NSOrderedSame:
NSLog(@"忽略大小寫相同的字串");
break;

case NSOrderedDescending:
NSLog(@"降冪");
break;

default:
NSLog(@"無法判定");
break;
}

在 Objective-C 中 NSComparisonResult 的定義。
enum _NSComparisonResult {NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending};
typedef NSInteger NSComparisonResult;


搜尋
//搜尋字串
NSString *str =[[NSString alloc] initWithString:@"NSString"];
//有區分大小寫
NSRange search = [str rangeOfString:@"Str"];
//數字表示第幾字元開始有符合(從0開始)
NSLog(@"%i", search.location);


擷取
//字串擷取
NSString *str =[[NSString alloc] initWithString:@"NSString"];

//擷取前五位元
NSLog(@"%@", [str substringToIndex:5]);

//擷取時略過前五位元
NSLog(@"%@", [str substringFromIndex:5]);

//從第二個位元開始擷取三個位元(第一個字符為第零位元)
NSLog(@"%@", [str substringWithRange:NSMakeRange(2, 3)]);


替換
//字串替換
NSString *str =[[NSString alloc] initWithString:@"NSString"];
NSString *_str;

//尋找字串並取代
_str = [str stringByReplacingOccurrencesOfString:@"NS" withString:@"CS"];
NSLog(@"%@", _str);

//尋找範圍並取代
_str = [str stringByReplacingCharactersInRange:NSMakeRange(2, 3) withString:@"*******"];
NSLog(@"%@", _str);


如何拆解 NSString 並置入 NSArray 中。
NSString *string = @"Never Forget Me";
//字串以空白間鍵做分段依據
NSArray *strArray = [string componentsSeparatedByString:@" "];

2012年11月20日 星期二

XCode 常用快捷鍵

(4.3.2環境下)

⌘——Command ()

⌃ ——Control

⌥——Option (alt)

⇧——Shift

⇪——Caps Lock

fn——功能鍵就是fn

自動排版 ^ + i(針對當前行,如果想全文,先全選,再剪切,再粘貼就可以哦)

代碼摺疊 ⌘ + ⌥ + left(or right)

註釋代碼 ⌘ + /

查看名稱定義,進入頭文件 ⌘+鼠標左鍵

查看名稱api文檔 ⌥+鼠標左鍵,非常方便哦

前進後退文本文件 ⌘+⌃ +←or→

關閉當前文本文件 ⌘+⌃+w

增加縮進 ⌘ + [ ( 『 ] 』 是減少)

打開查找窗口 ⌘ + shift + F

iOS 6版本與之前版本差異

1、4英寸屏幕

舊的應用程式要與4英寸屏幕進行匹配,需要準備一張Default-568h@2x.png圖片,系統根據是否有此資源來識別是否支持4英寸屏幕。

至於其他資源不允許使用xxx-568h.jpg此格式來匹配屏幕,需要使用程式碼對屏幕進行檢測來分別進行匹配。

2、UINavigationViewController的變化

該類的initWithRootViewController在之前的版本是最終會使用到 init 方法的。因此在繼承UINavigationViewController時,直接在重寫 init 方法來初始化物件所需屬性即可。

但是在iOS6上是不會使用init方法,因此需要注意。

3、CFRelease的變化

在之前版本中如果CFRelease傳入 nil 是被允許的,這也符合我們傳入 nil 物件不會對我們的程序造成影響,

但是在iOS6中,這樣的寫法直接就當機了,所以程式碼中還是需要判斷一下是否為 nil 才是安全的做法。

4、UIPickerView的變化

在之前版本中可以使用
[_pickerView selectRow:-1 inComponent:0 animated:YES]; 。

但在iOS6中會導致當機。

5、UIActivityIndi​​catorView的變化

在之前的版本中假如調用了startAnimating方法之後,只要把UIActivityIndi​​catorView添加到子視圖中就會顯示加載動畫,

但在iOS6中只要移出顯示隊列則會停止動畫,特別在UITableViewCell中加入此控件,只要滾動幾下Cell的UIActivityIndi​​catorView就消失了,為解決此問題可以在加入顯示隊列時根據isAnimating屬性來判斷是否執行動畫,如果沒有則重新調用一下startAnimating方法。

6、通訊錄列表獲取差異

自iOS6.0後獲取通訊錄列表需要詢問用戶,經過用戶同意後才可以獲取通訊錄用戶列表。

而且ABAddressBookRef的初始化工作也由ABAddressBookCreate函數轉變為ABAddressBookCreateWithOptions函數。

下面程式碼是獲取通訊錄用戶列表的方法,相容之前的版本。
ABAddressBookRef addressBook = nil;
if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
{
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//等待同意後向下執行
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
{
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
} else {
addressBook = ABAddressBookCreate();
}
NSArray *personArray = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);



2012年11月19日 星期一

NSAssert

可以透過設定 Target 的 Build Settings 來防止編譯器將斷言的程式碼組譯到你的程式裡,在 Build Settings 中找到 Apple LLVM compiler 3.0 - Preprocessing 項目(Xcode 4.2),將 Preprocessor 的 Release 新增一個 NS_BLOCK_ASSERTIONS 值即可,之後當你使用 Release 版本進行編譯時程式將不會觸發任何的 assert。
 如果你想要在程式暫停時標示斷言的該行程式碼,可以案專案中的 Breakpoint Navigator 點選「+」新增一個 Symbolic Breakpoint,並在 Symbol 設定 objc_exception_throw,之後將此 Symbolic Breakpoint 設定到 要作用的區域裡即可。



按下專案上的中斷點按鈕