最受歡迎的 Stanford iOS 開發課程 (CS193P) 教科書, 包含 Xcode 4.5 和 iOS 6。目前全球50國家免費下載。
iPad and iPhone App Development 教科書
2012年11月26日 星期一
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
標籤:
design patterns,
Hadoop
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
- #import "SingletonObject.h"
- @implementation SingletonObject
- //宣告一個靜態的Singleton物件
- static SingletonObject *_singletonObject = nil;
- - (id)init {
- self = [super init];
- if (self) {
- //將 count 初始化為0
- count = 0;
- }
- return self;
- }
- //執行時會判斷是否 _singletonObject 已經完成記憶體配置
- + (SingletonObject *)sharedSingletonObject {
- @synchronized([SingletonObject class]) {
- //判斷_singletonObject是否完成記憶體配置
- if (!_singletonObject)
- [[self alloc] init];
- return _singletonObject;
- }
- return nil;
- }
- + (id)alloc {
- @synchronized([SingletonObject class]) {
- //避免 [SingletonObject alloc] 方法被濫用
- NSAssert(_singletonObject == nil, @"_singletonObject 已經做過記憶體配置");
- _singletonObject = [super alloc];
- return _singletonObject;
- }
- return nil;
- }
- - (void)addCount {
- count += 1;
- }
- - (void)showCount {
- NSLog(@"%d", count);
- }
- - (void)dealloc {
- [super dealloc];
- }
- @end
NSString 物件的操作方法
宣告與格式化
大小寫的轉換
在 iOS 6 SDK 中使用新的方法函式加入了 NSLocale 的概念,使裝置在不同的語系設定下皆可以正確的轉換這些字串。
比較
排序
在 Objective-C 中 NSComparisonResult 的定義。
搜尋
擷取
替換
如何拆解 NSString 並置入 NSArray 中。
//建立字串物件
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
⌘——Command ()
⌃ ——Control
⌥——Option (alt)
⇧——Shift
⇪——Caps Lock
fn——功能鍵就是fn
自動排版 ^ + i(針對當前行,如果想全文,先全選,再剪切,再粘貼就可以哦)
代碼摺疊 ⌘ + ⌥ + left(or right)
註釋代碼 ⌘ + /
查看名稱定義,進入頭文件 ⌘+鼠標左鍵
查看名稱api文檔 ⌥+鼠標左鍵,非常方便哦
前進後退文本文件 ⌘+⌃ +←or→
關閉當前文本文件 ⌘+⌃+w
增加縮進 ⌘ + [ ( 『 ] 』 是減少)
打開查找窗口 ⌘ + shift + F
標籤:
XCode
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的變化
在之前版本中可以使用
但在iOS6中會導致當機。
5、UIActivityIndicatorView的變化
在之前的版本中假如調用了startAnimating方法之後,只要把UIActivityIndicatorView添加到子視圖中就會顯示加載動畫,
但在iOS6中只要移出顯示隊列則會停止動畫,特別在UITableViewCell中加入此控件,只要滾動幾下Cell的UIActivityIndicatorView就消失了,為解決此問題可以在加入顯示隊列時根據isAnimating屬性來判斷是否執行動畫,如果沒有則重新調用一下startAnimating方法。
6、通訊錄列表獲取差異
自iOS6.0後獲取通訊錄列表需要詢問用戶,經過用戶同意後才可以獲取通訊錄用戶列表。
而且ABAddressBookRef的初始化工作也由ABAddressBookCreate函數轉變為ABAddressBookCreateWithOptions函數。
下面程式碼是獲取通訊錄用戶列表的方法,相容之前的版本。
舊的應用程式要與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、UIActivityIndicatorView的變化
在之前的版本中假如調用了startAnimating方法之後,只要把UIActivityIndicatorView添加到子視圖中就會顯示加載動畫,
但在iOS6中只要移出顯示隊列則會停止動畫,特別在UITableViewCell中加入此控件,只要滾動幾下Cell的UIActivityIndicatorView就消失了,為解決此問題可以在加入顯示隊列時根據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);
標籤:
iOS
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 設定到 要作用的區域裡即可。
按下專案上的中斷點按鈕
如果你想要在程式暫停時標示斷言的該行程式碼,可以案專案中的 Breakpoint Navigator 點選「+」新增一個 Symbolic Breakpoint,並在 Symbol 設定 objc_exception_throw,之後將此 Symbolic Breakpoint 設定到 要作用的區域裡即可。
按下專案上的中斷點按鈕
標籤:
Objective-C
訂閱:
文章 (Atom)