顯示具有 apps 標籤的文章。 顯示所有文章
顯示具有 apps 標籤的文章。 顯示所有文章

2012年12月16日 星期日

Objective-C 的精隨

There's three traits that differ objective-C with other object oriented language. They are sort of related but i will introduce them one by one.

Polymorphism: 

Well different class sure can have same name class methods. This is not much different with other object-orient language but will cause much confuse in pure C. But this feature will be very important if combine with following two other objective-c only feature.

 Dynamic Typing:

This together with polymorphism will make codes more reusable since return type and parameters types no longer fixed. This can enables run-time determined object types to call same name methods which can invoke different method calls. ex.
//assume Fraction and Complex class all defined Print but  show different format
id classobj;
aFraction * = [Fraction new];
aComplex *=[Complex new];
classobj = aFraction;
[classobj Print];
classobj = aComplex;
[classobj Print];

Well this is not significantly showing how Dynamic Typing's goodness. But pass attention that id object's method call is determined at runtime by which type of object it contains. This is highly not possible for other language.

Dynamic Binding

This feature means an object can determined at runtime which method it will invoke under circumstances at that time. Introduce selector concept and @selector directive. example as below
SEL action;
id graphicobject;
...
action = @selector (draw) ;
...
[graphicobject performSelector:action];

This will also introduce a series of method that under NSObject the perform support for dynamic typing and dynamic binding feature.

-(BOOL) isKindOfClass:class-object
-(BOOL) isMemberOfClass:class-object
-(BOOL) respondsToSelector:selector
-(BOOL) instancesRespondToSelector:selector
-(BOOL) isSubclassOfClass:class-object
-(id)performSelector:selector
-(id)performSelector:selector withObject:object
-(id)performSelector:selector withObject:object1 withObject:object2

2012年12月4日 星期二

Xcode 快捷鍵


轉載自http://www.cnblogs.com/yjmyzz/archive/2011/01/25/1944325.html
1. 文件
CMD + N: 新文件
CMD + SHIFT + N: 新项目
CMD + O: 打开
CMD + S: 保存
CMD + SHIFT + S: 另存为
CMD + W: 关闭窗口
CMD + SHIFT + W: 关闭文件

2. 编辑

CMD + [: 左缩进
CMD + ]: 右缩进

CMD + CTRL + LEFT: 折叠
CMD + CTRL + RIGHT: 取消折叠
CMD + CTRL + TOP: 折叠全部函数
CMD + CTRL + BOTTOM: 取消全部函数折叠
CTRL + U: 取消全部折叠

CMD + D: 添加书签
CMD + /: 注释或取消注释

CTRL + .: 参数提示
ESC: 自动提示列表

3. 调试

CMD + \: 设置或取消断点
CMD + OPT + \: 允许或禁用当前断点
CMD + OPT + B: 查看全部断点

CMD + RETURN: 编译并运行(根据设置决定是否启用断点)
CMD + R: 编译并运行(不触发断点)
CMD + Y: 编译并调试(触发断点)
CMD + SHIFT + RETURN: 终止运行或调试

CMD + B: 编译
CMD + SHIFT + K: 清理

4. 窗体

CMD + SHIFT + B: 编译窗口
CMD + SHIFT + Y: 调试代码窗口
CMD + SHIFT + R: 调试控制台
CMD + SHIFT + E: 主编辑窗口调整

5. 帮助

CMD + OPT + ?: 开发手册
CMD + CTRL + ?: 快速帮助
下面也是一些有用的快捷键(转自http://www.cppblog.com/brucejini/archive/2010/12/24/137367.html)

Command + Shift + E :扩展编辑器
Command + [ :左移代码块
Command + ] :右移代码块
Tab :接受代码提示
Esc :显示代码提示菜单
Ctrl + . (句点):循环浏览代码提示
Shift + Ctrl + . (句点):反向循环浏览代码提示
Ctrl + / :移动到代码提示中的下一个占位符
Command + Ctrl + S :创建快照
Ctrl + F :前移光标
Ctrl + B :后移光标
Ctrl + P :移动光标到上一行
Ctrl + N:移动光标到下一行
Ctrl + A : 移动光标到本行行首
Ctrl + E : 移动光标到本行行尾 --杨过注:这二个太有用了,刚开始用XCode,一直奇怪为啥Home与End键为啥不能直接定位到行首、行尾?
Ctrl + T :交换光标左右两边的字符
Ctrl + D:删除光标右边的字符
Ctrl + K :删除本行
Ctrl + L : 将插入点置于窗口正中
Command + Alt + D:显示open quickly 窗口
Command + Alt + 上方向键 :打开配套文件
Command + D :添加书签
Option + 双击:在文档中搜索
Command + Y :以调试方式运行程序
Command + Alt + P : 继续(在调试中)
Command + Alt + 0 :跳过
Command + Alt + I :跳入
Command + Alt + T :跳出

2012年5月1日 星期二

Objective C 學習隨記(三)

Category (類目)

class 觀念的延伸, 對於一個class的methods, 你可以分成不同的category, 然後在不同的實作檔定義, 這對大型的專案共同開發同一個class很有用, 另一個好處是可以加入新的方法到一個class而不會影響修改到原有的定義

實作方法例如:
in 2dops.m

@interface GraphicObject (2Dops)
-(void)drawObject:(GraphicObject*) gb;
-(void)moveObject:(GraphicObject*) gb:(int) x:(int) y;
@end

in 3dops.m

@interface GraphicObject(3Dops)
-(void)rorateObject:(GraphicObject*) gb: (int) x-axis: (int) y-axis;
@end

另有無命名的category, 其實作必須要跟class 的實作在同一個實作檔案

Protocol(協定)

objC可以宣告介面, 宣告方式如下
@protocol ProtocolName
-(id) protocolmethods: (ParameterType) Para1;
@end

class如果要conform此protocol, 就要實作protocolmethod

在class宣告地方
@interface classname:NSObject <ProtocolName>

method 實作方法跟class method一樣

2012年4月25日 星期三

Objective C 學習隨記(二)

objC 跟C 雖然是很類似的程式語言, 但是用慣了C 寫一些firmware的人要轉學objC 還是有一些觀念要適應一下! 下面介紹的就是一個objC專有的語法, 如果能靈活運用, 將省去不少重複的程式

同名異式

動態型別

動態連結

其實這三個觀念都環繞著一個特殊的資料型態 "id"

最根本的原因是objC裡, object type並不是在compiling type決定,而是在runtime決定

一個以id 宣告為type的物件, 它的type內容是可變的
例如


id mathobj;

Fraction *aFrac = [Fraction alloc] init];

Complex *bComp = [[Complex alloc] init];
mathobj = aFrac;
[mathobj print];
mathobj = bComp;
[mathobj print];

因為有繼承這個objC主要功能的關係, 很多物件都相互有同名的method, 當然內容可能各不一樣, 就可以用id這種型態, 動態呼叫不同的物件同名method

這部分又衍生一些檢查的功能
例如檢查這個class 的selector (method) 是否存在
selector是以SEL為type的物件
運用方法如下例

SEL action;
id graphicobject
...
action = @selector(draw)
...
[graphicobject performSelector: action];

也就是說selector可以動態選擇要執行的method


Try & Catch 例外處理

objC的exception 處理方式:
把有可能發生exception的程式段以
@try{
...
}
包起來

後面在撰寫處理程序
@catch(NSException exception){
...
}

@finally 是不管有沒有丟出exception都會執行的程式區

@throw可以自己丟出exception


2012年4月22日 星期日

Objective C 學習隨記(一)

最近因為Iphone4s 很熱, 開始對這Apple劃時代的產品產生興趣, apple跳脫舊科技公司產品的思維, 賣的不只是冰冷的硬體, 他還創造了一個ecosystem方便軟體工程師可以很方便的從開發環境到測試最後到線上銷售, 一條龍不需要太大的進入門檻, 這無疑讓軟體設計師可以不需要自組一個公司處理銷售服務, 完全只需要發揮創意! 想想台灣雖然身為科技島, 但是全都偏向代工, 對於創新的產業著墨不深, 當apple 和 google相繼開發出軟體開發平台, 這無疑的對台灣產業轉型, 提供一個最佳的機會, 畢竟創意才是科技的根本 

Ok 轉回主題, 不管是iphone還是ipad, 都是在apple公司開發的iOS上跑, 而iOS是從MacOSX 針對embedded device最佳化修改成的OS, 等同於Android是google基於linux 架構針對embedded device修改而成, 當然apple為了增加它應用程式(俗稱apps)的多樣性, 它徹底揚棄Microsoft對於開發人員設定的門檻, 這不得不說MS的失策, MS早在2000年初就進入smartphone的市場, 當時smartphone幾乎是MS獨佔, MS對每隻smartphone收的loyalty 超高, 加上MS對於Visual Studio收費真是高的嚇人, 所以會去開發它win ce apps的很少, 造成買了device卻沒甚麼apps可用的窘境, 一直到現在window mobile還在垂死掙扎, 就不多批評了.

不管iOS或Mac OSX應用程式都是用同一套開發工具,是免費的Xcode, 現在最新版本是4.0 , 使用的程式語言是objective C 這系列主要就是我讀一本書 "Programming in Objective-C" 4th edition的一些筆記 

objective-C 應該說是C的進化物件導向版本, 觀念非常像C++ class inherit 的觀念

 class宣告 

@interface Classname : NSobject //:NSObject 代表繼承於NSObject 
@property int a,b; //
@property代表 a跟b的 setter 和 getter由compiler自動產生, 要和implementation理加@synthesize a,b; 
-(return type) methodname:(type)para1:(type)para2;
@end 

class定義 

@implementation Classname
@synthesize a,b;
-(type) methodname: (type)para1:(type)para2 

 //statements 
}
 @end

 一般在實做class時要先allocate,再init 格式是
[[classname alloc] init] [classname alloc]會回傳一個class instance, 再呼叫class instance的init功能 也可以用 [classname new] 取代上述