2013年7月5日 星期五
讓 iOS App 優雅的 Crash 吧!
開發 iOS App 最害怕的一件事就屬上架審核了!
不僅要讓 Apple 恣意的玩弄 App 所有的功能以外,更令人尷尬的事情是 - Bug 總會在這時候爭先恐後的冒出來,造成 crash reject(註1:教育訓練定理)。
如果剛好這些 Bug 們生性害羞靦腆,躲過了審查而順利的上架了,這時候卻換成使用者三不五時反應說程式一直當機,一直閃退(註2:使用者天生是讓系統崩潰的天才),但是你卻想破頭也不知道原因是什麼,這時候如果有個能將當下的錯誤訊息回報給你,至少有個方向可以去追查。
註1:教育訓練定理。教育訓練等正式場合,系統的 Bug 就有如脫韁的野馬一般,總在令人意想不到的情形下大肆奔放。
註2:使用者天生是讓系統崩潰的天才。不解釋......
今天要介紹的是,如何讓 App 崩潰的時候,能夠崩的優雅,崩的面不改色,崩的理所當然。
2011年9月1日 星期四
Objective-C 的記憶體回收機制(下)
終於比較有空補完下集了!這一集主要想要分享Objective-C的直接存取與間接存取的差異,以及function return value 的 retain、release 時機。
首先先看下面一個很簡單的 student class:
student.h
student.m
首先先看下面一個很簡單的 student class:
student.h
@interface Student: NSObject {
NSString *iName;
NSString *iStudentID;
int age;
}
@property(nonatomic,copy) NSString *iName;
@property(nonatomic,copy) NSString *iStudentID;
@property(nonatomic,assign) int age;
@end
student.m
#import "student.h"
@implementation student
@synthesize iName,iStudentID,age;
- (void) dealloc {
[iName release];
[iStudentID release];
[super dealloc];
}
@end
2011年8月28日 星期日
Objective-C 的記憶體回收機制(中)
在上一篇文章裡面談到了自己對物件記憶體的操作,難道就只有開發者會對物件做計數器(retainCount)的操作嗎?答案是否定!有一些 api 會自動對物件的 retainCount +1或是 -1,最常見的例子就是陣列的操作。例如:
NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity : 0];//array.retainCount = 1 NSString *str1 = [[NSString alloc] initWithString : @"A"];//str1.retainCount = 1 NSString *str2 = [[NSString alloc] initWithString : @"A"];//str2.retainCount = 1 [arr addObject : str1];//str1.retainCount = 2 [arr addObject : str2];//str2.retainCount = 2 [arr removeObject : str1];//str1.retainCount = 1 [arr release];//array.retainCount = 0;str2.retainCount = 1 //系統回收 array [str1 release];//str1.retainCount = 0 [str2 release];//str2.retainCount = 0 //系統回收str1&str2
Objective-C 的記憶體回收機制(上)
這陣子為了 iPhone 學了 Objectiv-C ,一直對他的記憶體管理機制頗有微詞(笑),什麼時候該釋放,什麼時候該保留,真的是一點頭緒都沒有!建議初學者先把 Apple 官方的關於記憶體回收的說明文件先讀過一遍。(網頁版,PDF版),內容有空的話我再翻譯!
首先先解釋為什麼變數有時候要加星號(*),有時候又不加。這是因為在 C 與 C++,以及基於這兩種語言加以改良的 Objective-C ,星號(*)代表的意思是指向某個記憶體的指標(pointer), 而不加星號(*)表示是取值,例如:
首先先解釋為什麼變數有時候要加星號(*),有時候又不加。這是因為在 C 與 C++,以及基於這兩種語言加以改良的 Objective-C ,星號(*)代表的意思是指向某個記憶體的指標(pointer), 而不加星號(*)表示是取值,例如:
int number = 0;//取值 char[] name = ['n','a','m','e']; char *str = name;//取址
2011年7月28日 星期四
Objective-C 的 self
今天查被Apple reject的原因,剛好看到有關self的一些解釋,趕緊記下來免得忘記。
假設現在有個類別Test,裡面有一個NSData的成員。
當我們使用 self.NSData 的時候,就等同於呼叫編譯器幫我們自動產生的getter方法,retain + 1。
當我們使用 self.NSData = [[NSData alloc] init],就等同於呼叫setter的方法。
而編譯器產生的getter/setter就等同於自己寫的:
另外,在dealloc時,就不要再用self了!
假設現在有個類別Test,裡面有一個NSData的成員。
@interface Test : NSObject {
NSData *iData;
}
@property(nonatomic,retain) NSData *iData;
@end
當我們使用 self.NSData 的時候,就等同於呼叫編譯器幫我們自動產生的getter方法,retain + 1。
當我們使用 self.NSData = [[NSData alloc] init],就等同於呼叫setter的方法。
而編譯器產生的getter/setter就等同於自己寫的:
-(void) setIData : (NSData *) newData {
if(iData != newData){
[iData release];
iData = [newData retain];
}
}
-(NSData *) getIData {
return iData;
}
另外,在dealloc時,就不要再用self了!
2011年6月3日 星期五
Objective-C @property
interface中宣告
@property int age <= 編譯器自動產生 get 與 set 方法。
可以用的屬性有:
assign:適用於基本型態變數,例如int,char,NSInteger,CGFloat...等等。
copy:適用於NSString。
retain:以NSObject為基底的class。
@property int age <= 編譯器自動產生 get 與 set 方法。
可以用的屬性有:
| 屬性 | 說明 |
| getter=method | 指定物件的get method |
| setter=method | 指定物件的set method |
| readonly | 指定物件為唯獨狀態 |
| readwrite | 指定物件為可讀寫狀態(預設) |
| assign | 物件的值根據帶入的值決定,不改變索引計數(預設) |
| copy | 複製物件的設定,索引計數為1,釋放舊的物件 |
| retain | 保持物件的設定,提高物件的索引計數,並釋放舊的物件 |
| nonatomic | 不鎖定物件(多執行緒的時候,資源會競爭) |
assign:適用於基本型態變數,例如int,char,NSInteger,CGFloat...等等。
copy:適用於NSString。
retain:以NSObject為基底的class。
2011年5月27日 星期五
訂閱:
文章 (Atom)