2014年10月30日 星期四

int vs. NSInteger vs. NSNumber

NSInteger vs. int

NSInteger is typedef'ed based on the target architecture. In other word, it's an architecture-safe (64 vs 32 bit) type to support different platforms and implementations of C. Targeting a 32-bit CPU and OS it's 32-bits wide, on a 64-bit OS it's 64-bits wide.

What follows is how NSInteger is defined in NSObjCRuntime.h file :

And this is what Apple say in Foundation Data Types Reference :
When building 32-bit applications, NSInteger is a 32-bit integer. A 64-bit application treats NSInteger as a 64-bit integer.

Simply, the NSInteger typedef does a step for you: if the architecture is 32-bit, it uses int, if it is 64-bit, it uses long. Using NSInteger, you don't need to worry about the architecture that the program is running on. 

Apple recommends that you use NSInteger over normal types anyway, I would assume for portability!

結論:除非你有特定要int或是long,要不然就建議用NSInteger,這樣就不必去煩惱使用者用的是32-bit還是64-bit的iDevice。

更深入探討

Why use int at all?
Apple uses int because for a loop control variable (which is only used to control the loop iterations) int datatype is fine, both in datatype size and in the values it can hold for your loop. No need for platform dependent datatype here. For a loop control variable even a 16-bit int will do most of the time.
Apple uses NSInteger for a function return value or for a function argument because in this case datatype [size] matters, because what you are doing with a function is communicating/passing data with other programs or with other pieces of code; see the answer to When should I be using NSInteger vs int?in your question itself...
Apple use NSInteger (or NSUInteger) when passing a value as an argument to a function or returning a value from a function.
資料來源:http://stackoverflow.com/a/5320359/3295047

延伸閱讀:64-Bit Transition Guide for Cocoa Touch



NSNumber

NSNumber is an Objective-C class, a subclass of NSValue to be specific. Where a NSInteger or int will fit in a register, a NSNumber is an object that can hold/encapsulate any scalar type (IIRC - I don't use NSNumber if I can help it.  Way too slow.), It can be used when you need an NSObject that holds a scalar value.

You can create an NSNumber object from a signed or unsigned char, short int, int, long int, long long int, float, double or BOOL.

One of the primary distinctions is that you can use NSNumber in collections, such as NSArray or NSSet, where an object is required. For example, if you need to add a float into an NSArray, you would first need to create an NSNumber object from the float:
1
2
3
4
float percentage = 40.5;
...
// Create NSNumber object, which can now be inserted into an NSArray
NSNumber *percentageObject = [NSNumber numberWithFloat:percentage];

Cocoa提供了NSNumber類來包裝(即以物件object形式實現)基本數據類型。

例如以下創建方法:
+ (NSNumber*)numberWithChar: (char)value;
+ (NSNumber*)numberWithInt: (int)value;
+ (NSNumber*)numberWithFloat: (float)value;
+ (NSNumber*)numberWithBool: (BOOL) value;
例:NSNumber *n = [NSNumber numberWithInt:5];

將基本類型數據封裝到NSNumber中後,就可以通過下面的實例方法重新獲取它:
- (char)charValue;
- (int)intValue;
- (float)floatValue;
- (BOOL)boolValue;
- (NSString*)stringValue;
例:int i = [n intValue];



資料來源:
http://www.quora.com/What-is-the-difference-between-NSInteger-NSNumber-int-and-all-the-different-ways-to-represent-an-integer
http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html
http://stackoverflow.com/a/5870916/3295047
http://stackoverflow.com/a/4445224/3295047
http://www.wuleilei.com/blog/335

2014年10月26日 星期日

Local Notification介紹

基本設定

請求使用者運允許發送通知
從iOS 8開始,如果打完上面的程式就執行會出現類似下面這樣的錯誤碼

要把下面這段程式加上去,請求使用者允許App發送通知,我們的Local Notification才能正常運作,在iOS 8之前當然也要使用者的同意,不過可能以前是系統自動幫我們問吧,不過就像我常講的,其實我們不太需要知道以前是怎麼樣,反正現在這段程式是一定要寫就對了!

自訂特定的時間
一般fireDate的設定我們都是使用我們既有的資料或是稍微經過dateByAddingTimeInterval之類的處理,如果要完全自訂一個特定的時間的話,可以參考下面的程式碼。你會注意要我只設定了小時跟分鐘,如果想要設定通知是每天固定發出,只要設定小時跟分鐘就可以了。

alertAction
這段程式有個小問題,它可以執行,但我必須要自己去「設定」那裏把alert sytle從Banners改成Alerts,notification才會顯示成alert的形式,我目前還不知道問題出在哪裡,知道的人拜託告訴我~

icon Badge
注意第三行程式,我們也可以讀取目前的IconBadgeNumber做累加的動作

重複

使用自訂的聲音
我沒想到要使用自訂的聲音竟然這麼簡單,只要將想要播放的音檔匯入project中,再如下面的程式碼打就可以了,不過有兩點需要注意:
1音檔的長度不可以超過三十秒,要不然聲音會播不出來,我在Documentation裡沒看到這項規定,是在stackoverflow裡看到這篇回答才知道的,但我確定有這項限制,因為我之前就是卡關在這裡Orz
2音檔只有一些特定的格式可以

在通知中另外夾帶參數(一般是供其它地方的程式辨識用)

取消Local Notification
取消指定的通知
其實沒有一定要用下面的方式來尋找指定的Local Notification,也可以用其他屬性像是fireDate、alertBody...等,只要你能找到你要的特定通知就可以了。另外,雖然可以抓到自己想要的特定通知,但我試過並不能再修改其屬性。

取消全部

按下發送出來的通知後怎麼處理
當App已經沒有在運作

當App已經還在運作(可能在背景或是或是正在使用)


更深入的探討
https://www.facebook.com/groups/iostw/permalink/906779296016087/
https://www.facebook.com/groups/iostw/permalink/934380229922660/
https://www.facebook.com/photo.php?fbid=10202759629864986&set=gm.967383696622313&type=1

用Local Notification實現Alarm
要實作一個Alarm需要做到下面這幾點:
1播放音樂
2在背景執行
3定時
其實上面三點是一句話拆開來講:「在一段時間後在背景播放音樂」
我查了很多資料,發現目前Local Notification是唯一可以完全達到上面要求的方法,但那只是從技術面來看,實際使用的話會遇到兩個問題:
1.1Local Notification的聲音最長只能到三十秒,如果要做的一個鬧鐘的程式,我們絕對不可能讓他只響三十秒,當然我們可以一連排程好幾的Local Notification,可是這樣使用者打開他的iPhone的時候就是看到四五個Notification,這樣的使用者體驗非常差。
1.2我目前想到比較好的方法是:設一連串的Local Notification,只有第一個有設alertBody,後面幾個都設nil,因為我發現如果alertBody設nil,iDevice不會顯示任何東西,但音樂還是會播放。
1.3不過後來經過測試,這樣的UX爛炸了,因為一般我要用自訂的聲音,音檔一般都會像是一首歌之類的,用上面的方法,這首歌每次只會播三十秒就重新播放,越聽只讓我越煩燥而已。
2沒辦法像內建的鬧鐘可以有按鈕讓鬧鐘稍後再播放

我去網路上問,不過看起來應該是無解了Orz

2014年10月25日 星期六

Xcode相關工具 (未整理)

  1. Faux Pas for Xcode:可以幫你找出程式碼中各種隱藏起來的臭蟲(三十天試用版、個人版89鎂、企業版189鎂)
  2. RunEverywhere – An Xcode plugin allowing you to run and stop projects on multiple physical iOS devices.
  3. Remote – An Xcode plugin for automatic on-device testing allowing you to record and playback macros that run on device.
  4. RTImageAssets – A configurable Xcode plugin that generates missing image assets based on missing sizes.
  5. rest2Mobile – An Xcode plugin that allows you to automatically generate code for a REST service.
  6. DBSmartPanels – A configurable plugin allowing you to automatically hide the debugger and utilities panels when unneeded.
  7. MarvinXcode – A plugin adding many hotkeyed ccommands for easier selection, duplication, and deletion of code.
  8. MCLog – A plugin that enhances the debug console with output filtering that can work in real time and supports regular expressions.
  9. GitDiff – A plugin for easy visualization of modified and changed code based on the projects Git repo.
  10. ACCodeSnippetRepositoryPlugin – A plugin allowing you to seamlessly integrate the Xcode snippets library with a Git repository.
  11. Extractor Localizable Strings – A plugin allowing you to quickly turn a string into a localizable string bringing up a popup where you can specify the localized string’s key on hotkey press.
  12. Peckham – A plugin allowing you to bring up a popup for quickly creating import statements from anywhere within your code.
  13. XCFui – A plugin allowing you to easily identify unused imports within your code bringing them up as warnings on compilation.
  14. XprobePlugin – A plugin allowing you to easily browse your application’s memory  in a nice UIWebView based interface with filtering and searching capabilities.
  15. XcodeBoost – A plugin adding many nice features such as allowing you to extract method declarations from your implementation to paste in the header file, highlight based on regex, paste lines while preserving code formatting and more..
  16. WCGitTagsPlugin – A plugin allowing you to easily add, view, and remove Git tags through a GUI within Xcode.
  17. BBUFullIssueNavigator – A plugin allowing you to display full content in the Xcode issue navigator (no more ellipsis).
  18. BBUDebuggerTuckAway – A plugin that automatically hides the debugger when you start typing within the code editor.
  19. CodePilot – Allows you to quickly search through Xcode projects using keywords allowing you to quickly search and navigate through an Xcode project. Formerly paid plugin now open source and working with Xcode 5.
  20. ClangFormat-Xcode – A plugin that allows you to format code using the Clang Format tool allowing you to chose from a number of preset configurations or your own.
  21. XToDo – A plugin that provides an interface allowing you to jump through todo’s, within your code labeled by your comments.
  22. XCAddedMarkup – A plugin that allows you enabling display of images and hyperlinks within your code using a special markup syntax.
  23. XAlign – A plugin for aligning your code automatically in user definable ways with a number of sample alignments such as align to first euqals included.
  24. ShowInGithub – An Xcode plugin allowing you to quickly jump to the corresponding location for a line or block of code on Github or Bitbucket.
  25. KFCocoaPods – A plugin for working with Cocoapods providing easy downloading and updating of CocoaPods, podfile editing with code completion, and CocoaPods output in the console.  (Xcode 5 tested)
  26. SCXCodeMiniMap – Creates a minimap of your code adjusting the color of the currently visible area of the editor so you can quickly see where you are within your code.
  27. Injection – Allows you to inject code in real-time to an app running in the simulator or device  so that you can tweak your code without recompiling.  Formerly a paid plugin, but now available as open source.
  28. Xcode Fixins - A collection of plugins for minimizing distractions in Xcode, and fixing code completion.
  29. XVim – Adds many Vim key bindings to Xcode.
  30. Mini-Xcode – Allows you to remove the large Xcode IDE toolbar to save screen space providing mini scheme and device selection.
  31. ColorSense – Provides a color picker for adjustments when you highlight a UIColor or NSColor within your code.
  32. BBUncrustifyPlugin -Enables easy use of the Uncrustify code beautification tool.
  33. Lin – Provides a neat interface directly within Xcode to make working with NSLocalizedString easier.
  34. KSImageNamed – Provides auto completion for UIImage imageNamed: within your code by scanning through image files within your workspace.
  35. HOStringSense – Provides a call out bubble in which you can work with an unescaped version of a string.
  36. XcodeColors – Allows you to color code messages in the debugging console so you can make errors stand out and easily separate different messages from differing parts of your code.
  37. AutoresizeMask – Allows you to visualize your autoresizing masks within code.
  38. JDListInstalledPlugins – Allows you to list your installed plugins, and one click remove.
  39. Alcatraz – Provides easy install/removal of Xcode plugins, color schemes, and templates.  A newer project so there is not too much in there, but a good idea.
RunEverywhere – An Xcode plugin allowing you to run and stop projects on multiple physical iOS devices.
Remote – An Xcode plugin for automatic on-device testing allowing you to record and playback macros that run on device.
RTImageAssets – A configurable Xcode plugin that generates missing image assets based on missing sizes.
rest2Mobile – An Xcode plugin that allows you to automatically generate code for a REST service.
DBSmartPanels – A configurable plugin allowing you to automatically hide the debugger and utilities panels when unneeded.
MarvinXcode – A plugin adding many hotkeyed ccommands for easier selection, duplication, and deletion of code.
MCLog – A plugin that enhances the debug console with output filtering that can work in real time and supports regular expressions.
GitDiff – A plugin for easy visualization of modified and changed code based on the projects Git repo.
ACCodeSnippetRepositoryPlugin – A plugin allowing you to seamlessly integrate the Xcode snippets library with a Git repository.
Extractor Localizable Strings – A plugin allowing you to quickly turn a string into a localizable string bringing up a popup where you can specify the localized string’s key on hotkey press.
Peckham – A plugin allowing you to bring up a popup for quickly creating import statements from anywhere within your code.
XCFui – A plugin allowing you to easily identify unused imports within your code bringing them up as warnings on compilation.
XprobePlugin – A plugin allowing you to easily browse your application’s memory  in a nice UIWebView based interface with filtering and searching capabilities.
XcodeBoost – A plugin adding many nice features such as allowing you to extract method declarations from your implementation to paste in the header file, highlight based on regex, paste lines while preserving code formatting and more..
WCGitTagsPlugin – A plugin allowing you to easily add, view, and remove Git tags through a GUI within Xcode.
BBUFullIssueNavigator – A plugin allowing you to display full content in the Xcode issue navigator (no more ellipsis).
BBUDebuggerTuckAway – A plugin that automatically hides the debugger when you start typing within the code editor.
CodePilot – Allows you to quickly search through Xcode projects using keywords allowing you to quickly search and navigate through an Xcode project. Formerly paid plugin now open source and working with Xcode 5.
ClangFormat-Xcode – A plugin that allows you to format code using the Clang Format tool allowing you to chose from a number of preset configurations or your own.
XToDo – A plugin that provides an interface allowing you to jump through todo’s, within your code labeled by your comments.
XCAddedMarkup – A plugin that allows you enabling display of images and hyperlinks within your code using a special markup syntax.
XAlign – A plugin for aligning your code automatically in user definable ways with a number of sample alignments such as align to first euqals included.
ShowInGithub – An Xcode plugin allowing you to quickly jump to the corresponding location for a line or block of code on Github or Bitbucket.
KFCocoaPods – A plugin for working with Cocoapods providing easy downloading and updating of CocoaPods, podfile editing with code completion, and CocoaPods output in the console.  (Xcode 5 tested)
SCXCodeMiniMap – Creates a minimap of your code adjusting the color of the currently visible area of the editor so you can quickly see where you are within your code.
Injection – Allows you to inject code in real-time to an app running in the simulator or device  so that you can tweak your code without recompiling.  Formerly a paid plugin, but now available as open source.
Xcode Fixins - A collection of plugins for minimizing distractions in Xcode, and fixing code completion.
XVim – Adds many Vim key bindings to Xcode.
Mini-Xcode – Allows you to remove the large Xcode IDE toolbar to save screen space providing mini scheme and device selection.
ColorSense – Provides a color picker for adjustments when you highlight a UIColor or NSColor within your code.
BBUncrustifyPlugin -Enables easy use of the Uncrustify code beautification tool.
Lin – Provides a neat interface directly within Xcode to make working with NSLocalizedString easier.
KSImageNamed – Provides auto completion for UIImage imageNamed: within your code by scanning through image files within your workspace.
HOStringSense – Provides a call out bubble in which you can work with an unescaped version of a string.
XcodeColors – Allows you to color code messages in the debugging console so you can make errors stand out and easily separate different messages from differing parts of your code.
AutoresizeMask – Allows you to visualize your autoresizing masks within code.
JDListInstalledPlugins – Allows you to list your installed plugins, and one click remove.
Alcatraz – Provides easy install/removal of Xcode plugins, color schemes, and templates.  A newer project so there is not too much in there, but a good idea.
資料來源:https://maniacdev.com/xcode-plugins


Xcode Plugin Listing – Quality Xcode Plugins
Alcatraz:The package manager for Xcode

CodePilot

2014年10月16日 星期四

atomic vs. nonatomic

nonatomic :
  • does not enforce thread safety on the property, mainly for use when only one thread shall be used throughout a program.


atomic(default) : 我目前有找到幾種解釋,因為還沒整理完,所以先都貼上來。
  • enforces thread safety on the property, mainly for use when multiple threads shall be used throughout a program
  • More precisely, tomic properties do not ensure thread-safety; rather it ensures atomicity. If thread A and thread B are both writing, atomic ensures that the outcome will be a whole value, meaning either one or the other. Which one is undefined. Writing thread-safe code is not as simple as using atomic properties. See the "Synchronization" section of the Threading Programming Guide
  • atomic是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數據錯誤。而這種機制是耗費系統資源的,所以在iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那麼 nonatomic 是一個非常好的選擇。
  • Atomicity has to do with how properties behave in a threaded environment. When you have more than one thread, it’s possible for the setter and the getter to be called at the same time. This means that the getter/setter can be interrupted by another operation, possibly resulting in corrupted data. Atomic properties lock the underlying object to prevent this from happening, guaranteeing that the get or set operation is working with a complete value. However, it’s important to understand that this is only one aspect of thread-safety—using atomic properties does not necessarily mean that your code is thread-safe.

整理來源:
http://stackoverflow.com/a/10753201/3295047
http://stackoverflow.com/questions/9162926/ios-property-declaration-clarification
http://rypress.com/tutorials/objective-c/properties.html

2014年10月14日 星期二

2014年10月13日 星期一

吳祥輝書單

1. 「拒絕聯考的小子」1975
2. 「斷指少年」 1977
3. 「拒絕國民黨的小子」 1984
4 「李敖死了」 1986
5 「吳祥輝選舉學」 2002
4. 「芬蘭驚豔」 2006
5. 「驚歎愛爾蘭」 2007
6. 「我是被老師教壞的」 2008
7. 「驚喜挪威」 2009
8. 「陪你走中國」 2010
9 「驚恐日本」 2011


吳祥輝:「芬蘭驚豔 驚歎愛爾蘭 驚喜挪威
是想讓台灣人更了解自己
因為我從沒認識過一個真正認識台灣的人
您可別把書看錯了
這其實不是獨立的三本書
而是一本書的上中下集
陪你走中國 驚恐日本
是想讓台灣人更了解別人
因為我也從沒認識過一個了解日本和中國的台灣人」
原網址:https://www.facebook.com/brianwuhsianghui/posts/723469104401713

吳祥輝:「驚恐日本是繼芬蘭驚豔 驚歎愛爾蘭 驚喜挪威
陪你走中國 後的 第五本 國家書寫
也是父子三部曲的第二部
父子三部曲是
陪你走中國 驚恐日本 和寫作中的韓國
台灣人可以用全新的角度
看中國 日本 南韓 這三個鄰國
這是寫這三個國家的本意」
原網址:https://www.facebook.com/brianwuhsianghui/posts/723465251068765

2014年10月10日 星期五

日本人是怎麼看待中國文化

我發現我用「日本人是怎麼看待中國文化」這幾的字搜尋,出來的幾乎都是中國那邊的東西,而且胡扯居多。

我找到這兩本書:
這本書的書評:
「會去翻譯一本這樣的書,除了個人長期接觸日本文化這個單純動機外,最重要的是,我深刻體會到台灣對日本的深層依賴,以及認知到從被殖民至今的百年期間,反日、仇日、哈日、媚日等錯綜複雜的歷史情結如何糾結、如何捆綁一個台灣人的意識。因此,我先以《日本人論:從明治維新到現代》(以下簡稱《日本人論》)中的亞洲、從《日本人論》反思台灣人論這兩個脈絡去說明個人譯介《日本人論》到臺灣的意義。

『日本人論』與台灣

誠如南博在本書開宗明義所說的,日本人確實是一個好於自我定義的民族,在這自我定義的漫長百年中,日本一直透過他族來對照自己、找尋自己。從明治維新把日本推向近代國家開始,日本便把這個他族設定在所謂的西方人,至此之後,日本人論的論戰就在和西方人的對照之下不停地來回擺盪。人類學家青木保1在整理二次戰後日本文化論的流變時也提到,日本人論所指涉的他族或對話的他族,通常是限定在西方、西洋、美國、歐美等方位中。可以說,日本人在自我定義的百年時光裡,只有比日本人更高級、更上層、更值得模仿的西方人才足以列入日本人論的論戰之中。

所以,包括《日本人論》在內的多數日本人論,其論述的對象都只限於西方,亞洲幾乎是不存在的,換言之,我們只看到「日本v.s.西方」的對照,很少看到「日本v.s.亞洲」的關係。以中國為例,中國是亞洲的一部份,但中國也幾乎是缺席的,在《日本人論》當中我們可以清楚看到,近世以來的日本多麼渴望擺脫中國的束縛,即便日本也承認中國文化與文明曾在歷史上帶給自己深遠的影響。

雖然,亞洲在日本人論當中缺席,不過眾所周知地,當日本人在談論「日本v.s.亞洲」的關係時,日本式的東方主義(orientalism)總是無所不在。福澤諭吉主張日本必須脫離疲憊、停滯、落後、愚癡的亞洲,進入科學、文明、進步、近代的歐洲,脫亞入歐成為明治維新之後近代日本躋身強國之林最重要的意識型態,這種對亞洲東方主義式的偏見也束縛了日本對亞洲「其他可能」的認識。譬如,文學家谷崎潤一郎2或夏目漱石3都曾在二十世紀初去過中國,也曾露骨地表達他們在文化上及種族上對中國的歧視。不幸的是,這種歧視似乎沒有褪色,近年來,日本仍以優越的姿態看待台灣及亞洲的哈日現象,仍帶著有色的眼神去鄙視發展中的亞洲國家4。

那麼,臺灣呢?臺灣又是如何地自我定位呢?

如前所述,《日本人論》的對象是西方,如果也有所謂台灣人論的話,臺灣人論的對象不是日本就是中國,臺灣人很少會去和西方直接對話,更少有人會把台灣拿去和東南亞做比較。這可能是歷史的宿命,也是人類的通病,因為,人們總以「親密的強勢文化」做為模仿對象或參考指標,即便這些強勢者多是壓迫者。當看到《日本人論》的日本人徘徊在「西方崇拜v.s.西方批判」、「日本人優秀說v.s.日本人劣等說」之時,我們也該反思,台灣人論裡面同時存在著仇日媚日的兩極想法,統獨各方也分別設定了自我和中國的不等距離。或許對弱勢者而言,這種和親密強勢文化之間的拉扯,注定是一場永無止境的夢魘。另一方面,當在批評日本脫亞入歐的思維或日本對亞洲東方主義式的偏見時,我們也該想想,台灣到底如何對待自己的東南亞鄰人,比之於日本對亞洲的歧視,台灣對東南亞文化及人種上的鄙夷其實是有過之而無不及的5。

因此,譯介《日本人論》到臺灣的意義就在於從「知彼知己、知己知彼」的過程中,找到屬於台灣人主體性的方位,這個方位既是多元的也是辯證的。」
原網址:http://www.cc.ncu.edu.tw/~csa/oldjournal/33/journal_book_35.htm

2014年10月9日 星期四

@property 介紹

@property是在Objective-C 2.0(2006年)新加入的功能,目的是要簡化一個實體變數(instance variable, 簡稱ivar)設定的過程。
在沒有@property功能之前,要自己宣告setter跟getter。

各種屬性介紹

讀寫相關:
  • readwrite(default)
  • readonly

記憶體管理相關:
  • Automatic Reference Counting(ARC):這部分對初學者來說比較難懂,簡單講,絕大部分時我們會用的是strong,weak是一些比較進階的功能才會用到,所以初學者每次在設定的時候用strong就可以了。如果想要知道背後詳細的原理及解釋可以看我另外寫的這篇Automatic Reference Counting(ARC)
    • strong:
    • weak:
  • Manual Reference Counting(MRC):這是上一代的記憶體管理方式,現在已經不用了,因為ARC遠遠比MRC好用太多了,只需要知道有這些屬性的存在就可以了,因為在網路上還是很容易找到比較舊的文章是用MRC。
    • assign(default) : 直接指派,不進行 retain
    • retain : 先 release 再 retain 新值
    • copy : 先 release 再 copy 新值

多執行緒相關:對初學者來說,這部分比較難懂,我後面打的解釋是結果論,如果想要知道兩個屬性背後實際上是怎麼回事可以看這篇atomic vs. nonatomic
  • nonatomic : 沒有要用多執行序就選這個,但不知道為什麼Apple並沒有把這個屬性設為預設,所以幾乎是每次都要加上這個屬性。
  • atomic(default) : 如果要使用多執行序就選這個。

setter/getter相關(accessors):
  • setter = setterName:重新命名setter名稱
  • getter = getterName:重新命名getter名稱,最常改的方式是在原本的名稱加「is」ex:@property (nonatomic, getter = isChosen) BOOL chosen;

@synthesize

@property DECLARES the accessors for your property, @synthesize will IMPLEMENT them.
原本是在@interface的程式
-(int) price;
-(void) setPrice: (int) p;
可以只要寫
@property int price;

在@implementation的程式從
-(int) price
{
  return price;
}

-(void) setPrice: (int) p
{
  price = p;
}
變成只要寫
@synthesize price;
Xcode 4.3 之前,每一個 @property 都要在 @implementation 加上 @synthesize 變數名稱 或 @synthesize 變數名稱 =_ 變數名稱 但 4.4 之後就自動化了,如果沒寫,就等於寫了 @synthesize 變數名稱 =_ 變數名稱,而 @synthesize 的設定,也可以改變變數的名稱,如 【@synthesize 變數名稱;】 時,變數名稱前面就不再有 underline, 有興趣的讀可以查一下 @synthesize 的功能。

2012年Objective-C加入了不少新功能,@synthesize變成預設值,現在有沒有寫@synthesize的差別只在於你取用變數的方式:
有寫@synthesize
price
沒有寫@synthesize
self.price

自訂setter/getter

但如果你要自訂自己的setter/getter的話,你就要自己寫setter/getter 函數,系統會以你自己寫的函數為主。
例如我們自訂setter:
-(void)setPrice:(int)p
{
  price = p * 2;
}
這樣的話當我們在給price值的時候,就會自動變成兩倍,也就是當我們打的程式碼是:
price = 3;
price的值實際上是6而不是3,因為3傳入時還會被乘以二。


Attribute 屬性

在2006年發佈了Objective-C 2.0後,Objective-C也可以使用「.」來存取物件的屬性
原本要設值是這樣
[b setPrice:300];
就可以寫成
b.price = 300;

不過在高見龍的部落格裡有提到點語法的一個小細節,有可能造成無窮回圈:
-(void) setPrice: (int) p
{
  self.price = p;
}
如果在自訂的setter裡使用了點語法,那就會不斷的呼叫自己(setter函數),變成無窮迴圈。


    整理來源:
    http://stackoverflow.com/questions/9162926/ios-property-declaration-clarification
    http://pydoing.blogspot.tw/2012/08/objc-property-and-synthesize.html
    http://shenfive.pixnet.net/blog/post/48054812-@property-
    http://blog.eddie.com.tw/2010/12/08/property-and-synthesize/

      支那是日本對中國的蔑稱,嗎?

      實際上「中國」這個詞也是中國思想遺毒,幾百年前大家早就知道地球是圓的了,只有自以為是的支那還自稱「中」國。

      另外關於「支那」一詞,很多人會認為那是日本人用的歧視用語,這是完全錯誤的認知,完全就是支那人不願承認自稱為「中國人」的荒謬所捏造的。

      「普遍认同的说法是“支那”起源于印度。印度古代人称中国为“cina”,认为Cina在梵文中表示中国“丝”,因中国是丝绸的故乡,古印度人和波斯人等都用中国丝(梵文Cina)代指中国,也有说法认为cina就是陶瓷(china)。

      汉明帝时,梵文Cina一词随着佛教传入中国,后又传到日本。古罗马称中国为“Sinoa”,后来的英文中的“China”,和法文中的“Chine”,都被认为是来自这个词源。不过“支那”一说并无贬义。

      至18世纪末,中日一战,中国战败并签订《马关条约》。一般认为,至此日本逐渐开始使用“支那”称呼中国,并带有蔑视和贬义。」
      http://news.ifeng.com/world/detail_2014_03/20/34944726_0.shtml
      可以看到直到日本稱中國為支那,支那一詞才開始歧視的意味,不過就是支那沒辦反接受小日本把他們打敗,而且還不稱他們為中國罷了。

      這篇報導裡說支那有歧視意味,根本邏輯不通,支那明明很明顯是China的音譯,何來歧視之說,更何況為什麼當地華人要歧視中國人??
      http://www.ettoday.net/news/20140314/334493.htm

      這類中國、中華的概念,只不過是中國不斷在推動以鞏固其政權的詞語罷了

      繁體字還是正體字?

      文字本來就會演變,沒有所謂的對錯,何來正統之說?

      最近在網路上看到這篇文章「如果正體字和媽祖都是「我們的」,那唐宋元明清是誰的?」,真的差點讓我暈倒,我沒想到還不少人會自稱台灣用繁體字為正體字。

             稱中國用的簡體字為殘體字,台灣用的中文為正體字,這我可以理解,因為這是標準台灣人對於中國常年打壓台灣的種種蠻橫行為的不滿的心理投射,但在這些稱呼背後所隱藏的觀念是錯誤的。

             既然中華人民共和國為聯合國認定的正統中國代表政權,那當然該國家所用的語言就是最為正統的中文,但很妙的是「正體字」 這個說法是台灣人自己說的, 醞釀中文的地方有黃河有長江,台灣根本沒有怎麼會有人敢自稱「正統」呢?打到這裡讓我想到彭明輝教授寫得一篇文章:
      『   德國人之所以為德國人,不只是因為他會講德語,還因為他們有共同的歷史和文化,承繼著類似的情感和價值觀。一個人如果不懂歌德、席勒的詩,聽不懂貝多芬的音樂,那他就跟德國的歷史與文化脫節。但是那些詩和音樂都是誕生於十九世紀以前的農業社會裡,如果德國的農村消失了,德國人還有機會懂得歌德和席勒的詩,聽懂貝多芬的音樂嗎?只要一個小小的想像實驗,我們就可以知道確切的答案。
             想像你在台北市的小學教一首李白的詩。你說:「床前明月光」,孩子們不懂,因為他們的生命經驗裡床前不可能有月光,頂多只有街燈和各種光害。你唸:「疑是地上霜」,沒人聽懂,你也不知道該如何解說,因為現在連電冰箱都已經無霜了。「舉頭望明月」,他們不懂:在高樓林立且光害充斥的天上,那顆看起來像蛋黃的東西有什麼好看的?「低頭思故鄉」,今天台北小孩有誰懂得「故鄉」的情懷?
             詩的生命不可能靠字典的解釋來傳承,而是靠蘊育出詩的生活情境來維繫;你必須有真實的農村生活體驗,才能感受到以農村為背景寫出來的文學與音樂。日本為了讓國人體會唐朝時代日本人的生活情境,甚至規定奈良唐昭提寺周圍的農地與農村必須維持原有景觀,不得變更。』
      http://www.appledaily.com.tw/realtimenews/article/new/20140316/360853/


             在文化上應該把台灣放在跟越南、韓國、日本一樣的位置上來看待才對,這些國家都深受中國文化影響,雖然我們說要看唐代的中國去日本,要看宋代的中國去韓國,但這些國家從來就不會以正統中國文化自居。

      越南
      原網址:https://www.facebook.com/IndependentGuts/photos/a.432311403556330.1073741828.395945433859594/638024779651657/?type=1&relevant_count=1

      韓國
      原網址:https://www.facebook.com/IndependentGuts/photos/a.432311403556330.1073741828.395945433859594/620755244711944/?type=1

             日本方面,我想我就不用貼什麼圖片了吧,台灣人對日本文化的熟悉應該是全世界數一數二的,我們都知道日本文化裡有很多看得到中國古代文化的影子,我就提點大家比較不知道的事情好了,我最近在看柯南才知道原來日本文化裡也有「十二生肖」。

             我們可以透過看看其他地方的人是怎麼看待中國文化跟漢字來思考何謂台灣的主體性(是這樣用嗎 囧)?

      我是直到前一陣子看到這部影片才知道原來除了新加坡外,在馬來西亞等東南亞地區也有人會講中文,這個影片中的女生說話完全是台灣腔,沒有半點中國腔的捲舌音,但我注意到這部影片 的簡介中「視頻」兩個字,這是中國用語,而且標題是用中國的那種英文拼音(是這樣說!?),我查了老半天才知道她是馬來西亞人!!!


      實際上除了中國跟台灣,世界上還有很多人會講中文


      關於馬來西亞華人用的中文可以看看這部影片,滿有意思的,在裡面也可以看到台灣文化輸出到馬來西亞的程度,什麼超級星期天、康熙來了他們都看過!?


      還有這部,北京話在馬來西亞真的跟廣東話還有馬來語融合得非常徹底


      星馬地區使用的台語


             最近開始有越來越多的澳門人跟香港人來中原讀書,我才發覺其實我們日常生活中用的中文也參雜了不少閩南語,並沒有像我們想像中的將中文跟閩南語完全分開來使用,各地的北京話都有跟當地的方言混在一起用。

             台灣用的中文有我們自己的文化,只是我們自己不知道而已,因為台灣是整個中文文化圈(註一)的文化輸出地,不管是中國還是東南亞的中裔馬來西亞人(註二),不管是台灣的偶像劇、綜藝節目或是歌(註三),因為我們自己是輸出地,所以渾然不知罷了。

      註一:俗稱華人文化圈
      註二:俗稱馬來西亞華人
      註三:講到台灣的歌,一定會有人問:那梁靜茹的歌算台灣的歌還是馬來西亞的歌?我認為應該要算是台灣的歌,因為梁靜茹的音樂是在台灣這個土壤裡生長出來的,她也用的是台灣的口音,徐若瑄去日本發展的作品,我們不會說那是台灣文化的一部份吧。

      另外台灣用的中文有我們自己的文化也顯現在「翻譯」上,雖然中國跟台灣都是用中文,表面上好像只有繁簡體的差別,但在翻譯上就可以明顯地看出雙方在語言的運用上的的差別。

      看看中國人怎麼看待它們的簡體字
      http://www.ted.com/talks/shaolan_learn_to_read_chinese_with_ease

      我舉iPhone 6的廣告詞 Bigger than Bigger為例:
      iPhone 6官网现身 又见苹果神翻译
      神翻译再见!iPhone 6大陆版口号也改为“岂止于大”
      太逗了:苹果发布会的神翻译 大陆又输给台湾

      顯然「比更大還要大」這個翻譯中國網友很不滿意,被吐槽的體無完膚
      「比更大還要大」 中國蘋果翻譯網友批完敗
      不滿意蘋果「豈止於大」的翻譯?網友:簡直大、比腎臟還大

      關於這次翻譯事件相關的深度文:
      什麼比bigger更重要?聊聊蘋果的iPhone 6文案翻譯
      为「比更大还更大」正名
      从iPhone6的文案看“假古文”翻译


             為了要去中國化,我最早想說那乾脆把台灣用的中文稱為台文好了,世界上應該沒有像繁簡體中文這樣,差異已經如此巨大還稱為同一種語言的吧,據我所知歐洲的很多語言間的差距歐非常小,很多用詞都可以互通,南島語族間的語言也是,既然他們可以分成不同語言,為什麼台灣不能。但是後來我認為鑑於中文是個有三千年文化的語言,現在直接一刀斬段把它變成台文有點過於牽強,畢竟那些成語都還是源自支那,所以我覺得稱台灣用的中文為「台式中文」比較好,要做到徹底去中國化,就要稱台灣用的中文為「台式中文」開始做起,然後規定外國人來台灣讀書都要會台式中文,其中一項重要的特徵就是會注音符號,要徹底的把支那用的中文隔絕出來,這樣關於台灣的輪廓就很明顯了。

      關於台式中文的書或文章:
      台灣人也不知道的台式國語
      一些讓我有奇怪聯想的台灣用語

             為了要將中文從教育與社會霸權的狀態下拉下,我對台灣國的想像,官方語言應該是北京話、閩南話、客家話還有所有的原住民均為官方語言才是。關於官方語言的態度,我覺得台灣可以參考分別有德語區、法語區、義大利語區跟羅曼語的瑞士。
      「但為了尊重各種官方語言,所以聯邦規定,在德語州的孩子要學法語,法語州的孩子要學德語,每一個瑞士人,不能只會講自己的母語,也要學習其他同胞的語言。」
      原網址:https://www.facebook.com/jenhausu/posts/938981256129744

             我在查資料的時候發現「通用注音字問世篇:方言的解放」這本書,我想這好像找到將其他語言文字化的方法了!現在北京話在台灣的社會霸權最主要的怡個原因就他有完整的文字及拼音系統。

      後記一:
      這是我貼在 「台獨論述研究所」裡所引發的討論
      原網址:https://www.facebook.com/groups/766871250019442/permalink/844043282302238/

      後記二:
      因為寫這篇文章我開始去思考「日本人是怎麼看待中國文化」這件事的,另外弄了篇blog

      2014年10月7日 星期二

      電腦椅的選擇

      這是我在Facebook上看到一篇關於高價電腦椅的評論,希望我以後有機會用到XDD

      「有人問我 Aeron 和 Embody 的 Review。
      我是六年前(2008) 年被推坑買 Aeron 的。就一直坐到現在。開公司幫同事買的椅子也是 Aeron。
      Aeron 最厲害的地方是這張椅子坐下去,你「不會有任何坐到厲害椅子的感覺」。但是坐幾個小時或一整天,去坐其它椅子的感想就會變成其它椅子「只是木板」而已。會有回不去的感覺。
      我當年要買椅子時,在 Aeron 和 Embody 間也是掙扎很久,一大部分是兩者相差大約 18K 卻沒有覺得有那個價差,所以放棄。就一直坐到現在。
      最近有同事想買我坐的 Aeron(對,我之前不只有一張,我大概有十張...),剛好趁這個機會就換台 Embody 看看。
      Embody 現在坐下去的感想,直接就會是「這是張很棒的椅子」。這也是辦公室其他有 Aeron 同事的感想。
      所以要買 Embody 的話,我可能還是要推薦有 Aeron 的人升級改換。沒坐過 Aeron 的話,其實有可能感受不到價值感在哪。
      這有點就會像 Ducky 要升 Filco / Cherry。沒用過 Filco 的狀況下說實在,要硬要去比 Filco / Cherry 還真的測不太出來。但是用過 Filco 就可以很強烈感受到 Cherry 的軟手感了。」

      https://www.facebook.com/xdite/posts/10152791996258552

      2014年10月6日 星期一

      Auto Layout 介紹

      Auto Layout 是個讓界面上的物件可以依據螢幕解析度大小的不同layout到畫面上正確的位置上的技術,2011年在Cocoa中發表,在2012年隨著iOS 6發表用來取代autosizing masks (struts-and-springs model) 。Auto Layout除了解決應對不同螢幕大小解析度或是螢幕方向的問題,同時也解決了在localization上會遇到的問題包括一些從右讀到左的語言。

      Auto Layout工具基本介紹:下面這些按鈕在Storyboard的右下角

      (圖片取自AppCoda網站)

      Align – 創造「對齊」相關的constraint
      右邊的數字是可以設定你要它離開中心點多遠,如果你要它在正中心的話,當然就設定為零就可以了。

      Pin – 創造spacing(空間)相關的constraint



      Issues – Resolve layout issues.


      Resizing – Specify how resizing affects constraints.
      Sibling 兄弟
      Ancestor 祖先
      Descendants 後人
      (這三個選項還不知道是做什麼的,只是先把英文翻出來Orz)

      有時創造的constraint會互相衝突,這些衝突顯示在Interface Builder outline view上,點選Storyboard右下角的按鈕就可以展開,就像寫程式一樣,如果警示的圖案中間是個圓圈的話,Xcode還會幫你修正自動加上它認為最合適的constraint。
      (圖片取自AppCoda網站)


      右邊的Utilities裡的Size inspector,顯示每個constraint以及其數據,也可以在這裡直接編輯,再下面可以設定各個contraint的priority。

      網路上找到別人寫的各個工具的細項介紹:IOS7.0 Xcode5 AutoLayout 备忘录


      正常成功的constraint在Storyboard上是顯示藍色的
      (圖片取自AppCoda網站)

       如果現有的constraint不足以完整地義該物件要放在哪裡,constraint就會是黃色的
      (圖片取自AppCoda網站)


             設定Auto Layout就像寫程式一樣,背後也有一套邏輯在運作,只要跟著邏輯走就沒錯了。

             設定Auto Layout的時候要同時考慮該物件的「長寬」以及「位置」,初學者一開始都只有在思考位置的問題,但這樣該物件的的大小形狀就會被擠壓到。
             以下面這張圖為例,可以看到分別有兩條設定長寬constraint跟四條設定置中的constrain,如果只有設定置中的contraint的話,在preview裡面是完全看不到東西的,因為沒有設定該物件的長寬,所以這個色塊會被縮小成一點完全看不見。
      但如果該物件的長寬是intrinsic Size,我們一般不會設定它的長寬,會讓它自動隨著需要做改變,像button跟label都是intrinsic size。

      其實Auto Layout除了用constraint設定外,也可以用程式設定,關於Auto Layout的API是NSLayoutConstraint,不過用Xcode就可以完成大部份的Layout設定了,如果真的要用程式碼來設定那應該是相當複雜,網路上關於這方面教學文更是少之又少,我目前只有找到下面這幾篇是在講程式的:
      NSLayoutConstraint 動態產生 Auto Layout 的效果
      AutoLayout (2) 手動建立 NSLayoutConstraint


      專有名詞解釋:

      Leading Space:左邊
      Trailing Space:右邊
      inferred:推斷
      Standard Value:Xcode建議的間隔大小


      設定Auto Layout 的小訣竅:

      1. 在設定constraint時最好不要設定特定的數字,不管是位置還是長寬。除非你自己很清楚我就是要讓某個關係(長寬或間格)是在特定的數字。
      2. 在設定Auto Layout時要同時思考position跟size的問題

      Xcode 6新增的功能:
      Compact Width | Compact Height : iPhone in landscape
      Compact Width | Regular Height : iPhone in portrait
      Regular Width | Regular Height : iPad in portrait or landscape
      所有設定一開始都一定要設定在Any Width | Any Height,要不然該設定就只會設定在特定的螢幕大小裡


      相關WWDC Session:

      • 2011 Session 103 : Cocoa Autolayout
        • Basics
        • Runtime
        • Layering
        • Debugging
        • Transition
        • 2012 Session 202 : Introduction to Auto Layout for iOS and OS X
          • Setting up Constraint-Based Layout
          • Layout Behind the Scenes
          • The Visual Format Language:make your code more easier to read
          • Things That Can Go Wrong
          • Compatibility Issue
        • 2012 Session 228 : Best Practices for mastering Auto Layout
          • 教程式
        • 2012 Session 232 : Auto Layout By Example
          • Transitioning to Auto Layout
          • Explicit Widths
          • Localization
          • New API
          • Animation
          • 2013 Session 406 : Taking Control of Auto Layout in Xcode 5
            • 一開始還是有介紹一下Auto Layout,主要都是示範,相當值得一看,到後面有比較複雜的操作。
          史丹佛的課程:9. Animation and Autolayout(從25分開始講Auto Layout)

          這個課程設計的非常棒,在短短四十分鐘裡就講了很多東西,強烈建議一定要看,其中他介紹了設定Auto Layout的三種方式:
          1. 使用Xcode建議的constraint:方法是把物件放在Xcode推薦的blue guidelines上,然後再按下Issues的Reset to Suggested Constraints選項,Xcode就會自動幫你設定他認為最適合的constraint,而要Xcode設定到最正確的constraint就是要用Xcode建議的blue guidelines。
          2. 使用下面Align跟Pin的功能
          3. 使用control-drag的方式創造constraint:如果在物件內部拖曳,可以設定長寬,橫著拖曳可以設定寬度,直著拖曳可以設定高度,斜著拖曳可以設定長寬比;如果點住該物件往外面空的地方拖曳,可以設定與邊界的間隔;如果往其他物件身上拖曳,可以設定兩個物件的關係。


          教學文:

          Introduction to Auto Layout(AppCoda):非常非常非常簡略的介紹,光看這篇的話是絕對學不會的,不過可以當作最入門的文章,因為Auto Layourt東西實在很多,一開始就看長篇大論教學文實在會很令人心煩。

          Beginning Auto Layout in iOS 6(Ray Wenderlich):非常長很詳細,有分Part1, Part2。從上一代作layout的技術autosizing masks的缺點講起,我想如果是iOS的初學者,這部分就可以跳過了,直接從Designing like you mean it這個部分開始看就可以了,我們不需要知道以前的技術有多麼的不方便,如果是從iOS 6前就開始開發iOS的人才比較需要看這段,比較兩個技術的差別也比較容易轉換到Auto Layout。
          • Auto Layout的運作邏輯 Designing Like You Mean It:
            • The big advantage of using constraints is that you no longer have to fiddle with coordinates to get your views to appear in the proper places. Instead, you can describe to Auto Layout how the views are related to each other and Auto Layout will do all the hard work for you. This is called designing by intent.
            • When you design by intent, you’re expressing what you want to accomplish but not necessarily how it should be accomplished. Instead of saying: “the button’s top-left corner is at coordinates (20, 230)”, you now say: “The button is centered vertically in its superview, and it is placed at a fixed distance from the left edge of the superview.”
            • Using this description, Auto Layout can automatically calculate where your button should appear, no matter how big or small that superview is.
            • This makes the design of your user interfaces much more descriptive. You simply define the constraints, and the system calculates the frames for you automatically.
          • Interface Builder only adds new constraints when the existing ones are no longer adequate.
          • 名詞解釋:User constraint,比較粗的那種T-bar。
          Auto-Layout-Showcase:Project for demonstrating several auto layout techniques on iOS.
          《Auto Layout 使用心得》系列文章

          相關工具:

          可以幫你寫 constraint 的 code
          http://constraints.icodeforlove.com/

          Code
          FLKAutoLayout:FLKAutoLayout is a category on UIView which makes it easy to setup layout constraints in code.


          相關討論

          https://www.facebook.com/groups/iostw/permalink/990792090948140/
          解法:

          Superview.bottom = label.top x 3 + 150
          在storyboard中 multiplier設定3 constant設定150

          根據要求,上下空間比例為 1:2,所以上下加起來的空間高度是上面空間高度的三倍,然後還差 img 的高度 150

          於是上面空間 x 3 + 150 就等於整個畫面的高度

          上面空間是 label.top
          整個畫面的高度則是 Superview.bottom


          深入探討:

          影片
          1. Achieving Zen With Auto Layout(投影片


          2. Auto Layout v.s Programmatically Layout by Claire Chang + Jamie Sa + Zonble @Cocoaheads Taipei


          文章
          1. iOS Autolayout Fun Facts and Tips
          2. 10 Things You Need To Know About Cocoa Auto Layout
          3. Content Compression and Hugging in Auto Layout


          蘋果官方文件:Auto Layout Guide


          Auto Layout的東西真的非常多,如果要打算一開始就把所有的東西都看完,我想是不太可能的,因為像priority這樣非常深入的工具,如果自己沒有這個需要,那是很難體會它的實用性,就算硬去學跟著操作一遍我想也是根本記不起來的。

          我個人推薦學習Auto Layout的順序是:
          1. 先看些非常簡單的教學,像是AppCoda這篇
          2. 然後再去一部教學影片,比如說史丹佛上課的那部
          3. 然後再去了解全部Auto Layout的功能,了解知道就好,這樣之後遇到問題就知道要往哪裡深入了解,可以看我這篇文章一開始的介紹,我把所有關於Auto Layout的工具都介紹過一遍了(如有遺漏請告訴我,感謝~)