1 Block教程系列
發佈者:Seven's - 2013/04/22 - 分類:夢印象
ios開發block的使用指南,以及深入理解block的內存管理,也適用於osx開發。
討論範圍:block的使用,內存管理,內部實現。
不包含的內容:gc arc下的block內存,block在c++中的使用。
- Block介紹(一)基礎
- Block介紹(二)內存管理與其他特性
- block介紹(三)揭開神祕面紗(上)
- block介紹(四)揭開神祕面紗(下)
2 iOS開發 git github 初學+進階
iOS開發 git github初學+進階
http://guxiaojje.blog.163.com/blog/static/140942291201272110343064/
3 iPhone應用程序的啓動過程
iPhone應用程序的啓動過程
http://mobile.51cto.com/iphone-284474.htm
4 使用靜態IP無法打開部分網頁的解決辦法
使用靜態IP無法打開部分網頁的解決辦法,手動設置DNS,並且備用DNS設置爲114.114.114.114
5 js枚舉類型
js枚舉類型定義:
方法 1:
var DataType = {String1:value1,String2:value2 }
方法 2:
var DataType = { } ;
DataType.String1=value1;
DataType.String2=value2;
遍歷枚舉類型:
for(var i in DataType ){
DataType[i]; //獲取value
i;//下標
}
6 當前無線網絡不能勾選“自動發現代理”,不然無法Safari無法聯網
7 xcode編譯時報錯Permission denied
錯誤信息;
/Users/huangjun/Library/Developer/Xcode/DerivedData/HJCommonSDK-agizpwqgszletfcizlxijeokyaaq/Build/Intermediates/iPhone.build/Debug-iphonesimulator/iPhone.build/Script-B52D492810DA4041008E8365.sh:line 2: ./Build Scripts/set_version_number.rb: Permission denied
8 【CoreData】新建記錄
ios中的coredata的使用
http://blog.csdn.net/chen505358119/article/details/9334831
1. //插入數據
2. - (IBAction)addIntoDataSource:(id)sender {
3. User* user=(User *)[NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.myAppDelegate.managedObjectContext];
4. [user setName:_nameText.text];
5. [user setAge:[NSNumber numberWithInteger:[_ageText.text integerValue]]];
6. [user setSex:_sexText.text];
7. NSError* error;
8. BOOL isSaveSuccess=[_myAppDelegate.managedObjectContext save:&error];
9. if (!isSaveSuccess) {
10. NSLog(@"Error:%@",error);
11. }else{
12. NSLog(@"Save successful!");
13. }
14.
15. }
9 【CoreData】查詢記錄
1. //查詢
2. - (IBAction)query:(id)sender {
3. NSFetchRequest* request=[[NSFetchRequest alloc] init];
4. NSEntityDescription* user=[NSEntityDescription entityForName:@"User" inManagedObjectContext:_myAppDelegate.managedObjectContext];
5. [request setEntity:user];
6. // NSSortDescriptor* sortDescriptor=[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
7. // NSArray* sortDescriptions=[[NSArray alloc] initWithObjects:sortDescriptor, nil];
8. // [request setSortDescriptors:sortDescriptions];
9. // [sortDescriptions release];
10. // [sortDescriptor release];
11. NSError* error=nil;
12. NSMutableArray* mutableFetchResult=[[_myAppDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
13. if (mutableFetchResult==nil) {
14. NSLog(@"Error:%@",error);
15. }
16. NSLog(@"The count of entry: %i",[mutableFetchResult count]);
17. for (User* user in mutableFetchResult) {
18. NSLog(@"name:%@----age:%@------sex:%@",user.name,user.age,user.sex);
19. }
20. [mutableFetchResult release];
21. [request release];
22. }
10 【CoreData】更新記錄
1. //更新
2. - (IBAction)update:(id)sender {
3. NSFetchRequest* request=[[NSFetchRequest alloc] init];
4. NSEntityDescription* user=[NSEntityDescription entityForName:@"User" inManagedObjectContext:_myAppDelegate.managedObjectContext];
5. [request setEntity:user];
6. //查詢條件
7. NSPredicate* predicate=[NSPredicate predicateWithFormat:@"name==%@",@"chen"];
8. [request setPredicate:predicate];
9. NSError* error=nil;
10. NSMutableArray* mutableFetchResult=[[_myAppDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
11. if (mutableFetchResult==nil) {
12. NSLog(@"Error:%@",error);
13. }
14. NSLog(@"The count of entry: %i",[mutableFetchResult count]);
15. //更新age後要進行保存,否則沒更新
16. for (User* user in mutableFetchResult) {
17. [user setAge:[NSNumber numberWithInt:12]];
18.
19. }
20. [_myAppDelegate.managedObjectContext save:&error];
21. [mutableFetchResult release];
22. [request release];
23.
24. }
11 【CoreData】刪除記錄
1. //刪除
2. - (IBAction)del:(id)sender {
3. NSFetchRequest* request=[[NSFetchRequest alloc] init];
4. NSEntityDescription* user=[NSEntityDescription entityForName:@"User" inManagedObjectContext:_myAppDelegate.managedObjectContext];
5. [request setEntity:user];
6. NSPredicate* predicate=[NSPredicate predicateWithFormat:@"name==%@",@"chen"];
7. [request setPredicate:predicate];
8. NSError* error=nil;
9. NSMutableArray* mutableFetchResult=[[_myAppDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
10. if (mutableFetchResult==nil) {
11. NSLog(@"Error:%@",error);
12. }
13. NSLog(@"The count of entry: %i",[mutableFetchResult count]);
14. for (User* user in mutableFetchResult) {
15. [_myAppDelegate.managedObjectContext deleteObject:user];
16. }
17.
18. if ([_myAppDelegate.managedObjectContext save:&error]) {
19. NSLog(@"Error:%@,%@",error,[error userInfo]);
20. }
21. }
12 【CoreData】多條件查詢
predicate = [NSPredicatepredicateWithFormat:@"(salesMan = %@) AND (customerName contains %@) AND(customerSex = %@) AND (createdDate >= %d) AND (createdDate <=%d)",[[NSUserDefaults standardUserDefaults]objectForKey:kDefaultUsernameKey], custName,custSex, fromTime, toTime];
13 【CoreData】處理海量數據
BatchUpdates可用於批量快速更新數據,Asynchronous Fetching可用於異步抓取海量數據,並可以通過 NSProgress 實現進度跟蹤和取消。
13.1 Batch Updates
在CoreData中想要更新大量數據,我們往往要將大量修改後的NSManagedObject
加載到 NSManagedObjectContext
中並保存,這會佔用大量內存,試想想在iPhone這樣的內存有限的移動設備上將是個災難,數據有可能丟失。你可能會採取批處理的方式,即一小批一小批的更新 NSManagedObject
並保存到 NSManagedObjectContext
中,但這樣會花費很多時間,用戶體驗較差。
爲了解決這個問題,蘋果在 NSManagedObjectContext
加入了一個新的方法:executeRequest:error:
,它接受一個 NSPersistentStoreRequest
類型的參數,返回類型爲 NSPersistentStoreResult
。
關於 NSPersistentStoreRequest
有些人可能比較熟悉,它是NSFetchRequest
、 NSSaveChangesRequest
、 NSBatchUpdateRequest
和 NSAsynchronousFetchRequest
的基類。後兩個類是這次iOS8新加的,也是這篇文章將要討論的內容。
NSPersistentStoreResult
是一個新加入的類,它也是一個基類,而且是抽象類,這個類作爲 executeRequest:error:
返回內容的父類,相當於一個接口,它目前有兩個子類: NSPersistentStoreAsynchronousResult
和NSBatchUpdateResult
。
你大概猜到了, NSBatchUpdateResult
對應着前面的NSBatchUpdateRequest
,下面說說 NSBatchUpdateRequest
。它有點像NSFetchRequest
:它允許你指定一個想要更新數據的實體;也可以指定一個affectedStores
,它存儲了一個接受更新請求的 NSPersistentStore
數組。(其實它是 NSPersistentStoreRequest
的屬性);它也有一個謂詞屬性來做更新的條件,它跟 NSFetchRequest
中的謂詞一樣強大和靈活,類似於SQL的where語句;它允許你指定想要更新的字段,通過 propertiesToUpdate
屬性來描述字段更新,它是一個字段,key爲 NSPropertyDescription
或屬性名字符串,value爲 NSExpression
或常量。
接着談談 NSBatchUpdateResult
,它有一個 result
屬性和 resultType
屬性, result
中的內容跟 resultType
有關,可能是成功或者失敗,有可能是每行被更新的ID,也可能是被更新的行數。
需要注意的是,由於 NSBatchUpdateRequest
並不會先將數據存入內存,而是直接操作數據庫,所以並不會引起NSManagedObjectContext的同步更新,所以你不僅需要獲取 NSBatchUpdateResult
然後刷新 NSManagedObjectContext
對應的數據和UI界面,還需要保證更新後的數據滿足數據庫模型上的 validation
,因爲 NSManagedObjectContext
沒有感知Batch
Updates,一些數據驗證工作就落在了程序員的身上(你需要寫一段代碼驗證更新後的數據是合法的,用戶可不希望在跑步APP上看到自己今天跑步里程是個負數)。一旦有非法數據錄入數據庫,下次加載並修改 NSManagedObject
的時候就會導致數據驗證失敗。除了上面提到的這些,還要注意Batch
Updates對數據庫的操作是樂觀鎖,也就是假定很少會發生同時存取同一塊數據的情況,所以你需要制定一個合理的”merge”策略來應付因同時更新數據產生的衝突。
Batch Updates的優勢在於其效率,在處理上萬條數據的時候,它執行的時間跟SQL語句執行時間相當。
13.2 Asynchronous Fetching
Asynchronous Fetching的加入依然是爲了解決CoreData讀取海量數據所帶來的問題。通過使用Asynchronous Fetching,我們可以在抓取數據的同時不阻塞佔用NSManagedObjectContext
,並可以隨時取消抓取行爲,隨時跟蹤抓取數據的進度。
設想我們平時用 NSFetchRequest
抓取數據的時候,我們會先用NSManagedObjectContext
的 executeFetchRequest:error:
方法傳入一個NSFetchRequest
,然後請求會被髮送到 NSPersistentStore
,然後執行一段時間後返回一個數組,在 NSManagedObjectContext
更新後,這個數組被當做executeFetchRequest:error:
的返回值返回到我們這裏。
而AsynchronousFetching則不同,當我們將一個NSAsynchronousFetchRequest
對象傳入 executeRequest:error:
方法後會立即返回一個“未來的” NSAsynchronousFetchResult
。NSAsynchronousFetchRequest
初始化時需要傳入兩個參數賦值給屬性:
1. completionBlock
屬性,允許我們在抓取完成後執行回調block;
2. fetchRequest
屬性,類型是 NSFetchRequest
。也即是說雖然是異步抓取,其實我們用的還是以前的 NSFetchRequest
,當 NSFetchRequest
抓取結束後會更新 NSManagedObjectContext
,這也就意味着NSManagedObjectContext
的併發類型只能是NSPrivateQueueConcurrencyType
或 NSMainQueueConcurrencyType
。
於是當我們用 NSAsynchronousFetchRequest
抓取數據時,我們會先用NSManagedObjectContext
的 executeRequest:error:
方法傳入一個NSAsynchronousFetchRequest
,這個方法在 NSManagedObjectContext
上執行時, NSManagedObjectContext
會立即製造並返回一個NSAsynchronousFetchResult
,同時 NSAsynchronousFetchRequest
會被髮送到 NSPersistentStore
。你現在可以繼續編輯這個NSManagedObjectContext
中的 NSManagedObject
,等到NSPersistentStore
執行請求完畢時會將結果返回給NSAsynchronousFetchResult
的 finalResult
屬性,更新NSManagedObjectContext
,執行 NSAsynchronousFetchRequest
的回調block。
舉個栗子:
let request = NSFetchRequest(entityName: "MyEntity") let async = NSAsynchronousFetchRequest(fetchRequest: request){ (id result) in if result.finalResult { //TODO.. } } |
Swift代碼很簡潔,並用了尾隨閉包語法,看不懂的朋友也不用着急,知道NSAsynchronousFetchRequest
大概的用法就行。
之前提到過 NSAsynchronousFetchRequest
能在抓取數據的過程中跟蹤進度,於是乎 NSProgress
登場了!一行代碼頂十句話:
let request = NSFetchRequest(entityName: "MyEntity") var asyncResult:NSPersistentStoreResult! let async = NSAsynchronousFetchRequest(fetchRequest: request){ (id result) in if result.finalResult { //TODO.. } } let progress = NSProgress(totalUnitCount: 1) progress.becomeCurrentWithPendingUnitCount(1) managedObjectContext?.performBlock{ [unowned self] in let error = NSErrorPointer() asyncResult = self.managedObjectContext?.executeRequest(async, error: error) } progress.resignCurrent() |
而取消獲取數據只需要取消 NSProgress
就可以了!取消行爲會沿着數的根節點蔓延到葉子。
progress.cancel()
|
可以在 cancellationHandler
屬性設置取消後執行的block,這裏不再多說。
14 【NSSet】NSArray NSSet轉換
1. NSArray *arr = @[@"12-11", @"12-11", @"12-11", @"12-12", @"12-13", @"12-14"];
2. NSSet *set = [NSSet setWithArray:arr];
3. NSLog(@"set%@\n", set);
15 【NSSet】NSSet的排序
1. NSArray *arr = @[@"12-11", @"12-11", @"12-11", @"12-12", @"12-13", @"12-14"];
2. NSSet *set = [NSSet setWithArray:arr];
3. NSArray *sortDesc = @[[[NSSortDescriptor alloc] initWithKey:nil ascending:YES]];
4. NSArray *sortSetArray = [set sortedArrayUsingDescriptors:sortDesc];
5. NSLog(@"set%@\nsort set%@", set, sortSetArray);
16 【JS】位運算的運算符優先級問題
在Javascript中,位運算的運算符優先級比加減號低,所以一定要注意,正確的寫法是在位運算符處加上括號:
_deviceStatusData.outflowTDS.value= (body[43] << 8) + body[42];
17 【JS】Js獲取當前日期時間及其它操作
varmyDate = new Date();
myDate.getYear(); //獲取當前年份(2位)
myDate.getFullYear(); //獲取完整的年份(4位,1970-????)
myDate.getMonth(); //獲取當前月份(0-11,0代表1月)
myDate.getDate(); //獲取當前日(1-31)
myDate.getDay(); //獲取當前星期X(0-6,0代表星期天)
myDate.getTime(); //獲取當前時間(從1970.1.1開始的毫秒數)
myDate.getHours(); //獲取當前小時數(0-23)
myDate.getMinutes(); //獲取當前分鐘數(0-59)
myDate.getSeconds(); //獲取當前秒數(0-59)
myDate.getMilliseconds(); //獲取當前毫秒數(0-999)
myDate.toLocaleDateString(); //獲取當前日期
var mytime=myDate.toLocaleTimeString(); //獲取當前時間
myDate.toLocaleString( ); //獲取日期與時間
日期時間腳本庫方法列表
Date.prototype.isLeapYear判斷閏年
Date.prototype.Format 日期格式化
Date.prototype.DateAdd 日期計算
Date.prototype.DateDiff 比較日期差
Date.prototype.toString 日期轉字符串
Date.prototype.toArray 日期分割爲數組
Date.prototype.DatePart 取日期的部分信息
Date.prototype.MaxDayOfDate 取日期所在月的最大天數
Date.prototype.WeekNumOfYear 判斷日期所在年的第幾周
StringToDate 字符串轉日期型
IsValidDate 驗證日期有效性
CheckDateTime 完整日期時間檢查
daysBetween 日期天數差
js代碼:
//---------------------------------------------------
// 判斷閏年
//---------------------------------------------------
Date.prototype.isLeapYear = function()
{
return(0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0)));
}
//---------------------------------------------------
// 日期格式化
// 格式 YYYY/yyyy/YY/yy
表示年份
// MM/M 月份
// W/w 星期
// dd/DD/d/D 日期
// hh/HH/h/H 時間
// mm/m 分鐘
// ss/SS/s/S 秒
//---------------------------------------------------
Date.prototype.Format = function(formatStr)
{
var str = formatStr;
var Week = ['日','一','二','三','四','五','六'];
str=str.replace(/yyyy|YYYY/,this.getFullYear());
str=str.replace(/yy|YY/,(this.getYear() % 100)>9?(this.getYear()% 100).toString():'0' + (this.getYear() % 100));
str=str.replace(/MM/,this.getMonth()>9?this.getMonth().toString():'0'+ this.getMonth());
str=str.replace(/M/g,this.getMonth());
str=str.replace(/w|W/g,Week[this.getDay()]);
str=str.replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0'+ this.getDate());
str=str.replace(/d|D/g,this.getDate());
str=str.replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0'+ this.getHours());
str=str.replace(/h|H/g,this.getHours());
str=str.replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0'+ this.getMinutes());
str=str.replace(/m/g,this.getMinutes());
str=str.replace(/ss|SS/,this.getSeconds()>9?this.getSeconds().toString():'0'+ this.getSeconds());
str=str.replace(/s|S/g,this.getSeconds());
return str;
}
//+---------------------------------------------------
//| 求兩個時間的天數差日期格式爲 YYYY-MM-dd
//+---------------------------------------------------
function daysBetween(DateOne,DateTwo)
{
var OneMonth = DateOne.substring(5,DateOne.lastIndexOf('-'));
var OneDay =DateOne.substring(DateOne.length,DateOne.lastIndexOf ('-')+1);
var OneYear = DateOne.substring(0,DateOne.indexOf('-'));
var TwoMonth = DateTwo.substring(5,DateTwo.lastIndexOf('-'));
var TwoDay =DateTwo.substring(DateTwo.length,DateTwo.lastIndexOf ('-')+1);
var TwoYear = DateTwo.substring(0,DateTwo.indexOf('-'));
var cha=((Date.parse(OneMonth+'/'+OneDay+'/'+OneYear)-Date.parse(TwoMonth+'/'+TwoDay+'/'+TwoYear))/86400000);
return Math.abs(cha);
}
//+---------------------------------------------------
//| 日期計算
//+---------------------------------------------------
Date.prototype.DateAdd = function(strInterval, Number) {
var dtTmp = this;
switch (strInterval) {
case 's' :return newDate(Date.parse(dtTmp) + (1000 * Number));
case 'n' :return newDate(Date.parse(dtTmp) + (60000 * Number));
case 'h' :return newDate(Date.parse(dtTmp) + (3600000 * Number));
case 'd' :return newDate(Date.parse(dtTmp) + (86400000 * Number));
case 'w' :return newDate(Date.parse(dtTmp) + ((86400000 * 7) * Number));
case 'q' :return newDate(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number*3, dtTmp.getDate(),dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
case 'm' :return newDate(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(),dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
case 'y' :return newDate((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(),dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
}
}
//+---------------------------------------------------
//| 比較日期差 dtEnd
格式爲日期型或者有效日期格式字符串
//+---------------------------------------------------
Date.prototype.DateDiff = function(strInterval, dtEnd) {
var dtStart = this;
if (typeof dtEnd == 'string' )//如果是字符串轉換爲日期型
{
dtEnd =StringToDate(dtEnd);
}
switch (strInterval) {
case 's' :returnparseInt((dtEnd - dtStart) / 1000);
case 'n' :returnparseInt((dtEnd - dtStart) / 60000);
case 'h' :returnparseInt((dtEnd - dtStart) / 3600000);
case 'd' :returnparseInt((dtEnd - dtStart) / 86400000);
case 'w' :returnparseInt((dtEnd - dtStart) / (86400000 * 7));
case 'm' :return(dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) -(dtStart.getMonth()+1);
case 'y' :returndtEnd.getFullYear() - dtStart.getFullYear();
}
}
//+---------------------------------------------------
//| 日期輸出字符串,重載了系統的toString方法
//+---------------------------------------------------
Date.prototype.toString = function(showWeek)
{
var myDate= this;
var str = myDate.toLocaleDateString();
if (showWeek)
{
var Week = ['日','一','二','三','四','五','六'];
str += ' 星期' + Week[myDate.getDay()];
}
return str;
}
//+---------------------------------------------------
//| 日期合法性驗證
//| 格式爲:YYYY-MM-DD或YYYY/MM/DD
//+---------------------------------------------------
function IsValidDate(DateStr)
{
var sDate=DateStr.replace(/(^\s+|\s+$)/g,''); //去兩邊空格;
if(sDate=='') return true;
//如果格式滿足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替換爲''
//數據庫中,合法日期可以是:YYYY-MM/DD(2003-3/21),數據庫會自動轉換爲YYYY-MM-DD格式
var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2}[\-/]{ 1 }[\d]{ 1,2 }/g,'');
if (s=='') //說明格式滿足YYYY-MM-DD或YYYY-M-DD或YYYY-M-D或YYYY-MM-D
{
var t=newDate(sDate.replace(/\-/g,'/'));
var ar = sDate.split(/[-/:]/);
if(ar[0] != t.getYear() ||ar[1] != t.getMonth()+1 || ar[2] != t.getDate())
{
//alert('錯誤的日期格式!格式爲:YYYY-MM-DD或YYYY/MM/DD。注意閏年。');
returnfalse;
}
}
else
{
//alert('錯誤的日期格式!格式爲:YYYY-MM-DD或YYYY/MM/DD。注意閏年。');
return false;
}
return true;
}
//+---------------------------------------------------
//| 日期時間檢查
//| 格式爲:YYYY-MM-DD HH:MM:SS
//+---------------------------------------------------
function CheckDateTime(str)
{
var reg = /^(\d+)-(\d{ 1,2 })-(\d{ 1,2 }) (\d{ 1,2}):(\d{ 1,2 }):(\d{ 1,2 })$/;
var r = str.match(reg);
if(r==null)return false;
r[2]=r[2]-1;
var d= new Date(r[1],r[2],r[3],r[4],r[5],r[6]);
if(d.getFullYear()!=r[1])returnfalse;
if(d.getMonth()!=r[2])return false;
if(d.getDate()!=r[3])return false;
if(d.getHours()!=r[4])return false;
if(d.getMinutes()!=r[5])return false;
if(d.getSeconds()!=r[6])return false;
return true;
}
//+---------------------------------------------------
//| 把日期分割成數組
//+---------------------------------------------------
Date.prototype.toArray = function()
{
var myDate = this;
var myArray = Array();
myArray[0] = myDate.getFullYear();
myArray[1] = myDate.getMonth();
myArray[2] = myDate.getDate();
myArray[3] = myDate.getHours();
myArray[4] = myDate.getMinutes();
myArray[5] = myDate.getSeconds();
return myArray;
}
//+---------------------------------------------------
//| 取得日期數據信息
//| 參數 interval
表示數據類型
//| y 年 m月 d日 w星期
ww周 h時 n分 s秒
//+---------------------------------------------------
Date.prototype.DatePart = function(interval)
{
var myDate = this;
var partStr='';
var Week = ['日','一','二','三','四','五','六'];
switch (interval)
{
case 'y' :partStr =myDate.getFullYear();break;
case 'm' :partStr =myDate.getMonth()+1;break;
case 'd' :partStr =myDate.getDate();break;
case 'w' :partStr =Week[myDate.getDay()];break;
case 'ww' :partStr =myDate.WeekNumOfYear();break;
case 'h' :partStr =myDate.getHours();break;
case 'n' :partStr =myDate.getMinutes();break;
case 's' :partStr =myDate.getSeconds();break;
}
return partStr;
}
//+---------------------------------------------------
//| 取得當前日期所在月的最大天數
//+---------------------------------------------------
Date.prototype.MaxDayOfDate = function()
{
var myDate = this;
var ary = myDate.toArray();
var date1 = (new Date(ary[0],ary[1]+1,1));
var date2 = date1.dateAdd(1,'m',1);
var result = dateDiff(date1.Format('yyyy-MM-dd'),date2.Format('yyyy-MM-dd'));
return result;
}
//+---------------------------------------------------
//| 取得當前日期所在周是一年中的第幾周
//+---------------------------------------------------
Date.prototype.WeekNumOfYear = function()
{
var myDate = this;
var ary = myDate.toArray();
var year = ary[0];
var month = ary[1]+1;
var day = ary[2];
document.write('< script language=VBScript\>\n');
document.write('myDate =Datue(''+month+'-'+day+'-'+year+'') \n');
document.write('result = DatePart('ww', myDate)\n');
document.write(' \n');
return result;
}
//+---------------------------------------------------
//| 字符串轉成日期類型
//| 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/ddYYYY-MM-dd
//+---------------------------------------------------
function StringToDate(DateStr)
{
var converted = Date.parse(DateStr);
var myDate = new Date(converted);
if (isNaN(myDate))
{
//var delimCahar =DateStr.indexOf('/')!=-1?'/':'-';
var arys=DateStr.split('-');
myDate = newDate(arys[0],--arys[1],arys[2]);
}
return myDate;
}
若要顯示:當前日期加時間(如:2009-06-1212:00)
function CurentTime()
{
var now = new Date();
var year =now.getFullYear(); //年
var month = now.getMonth() +1; //月
var day =now.getDate(); //日
var hh =now.getHours(); //時
var mm =now.getMinutes(); //分
var clock = year +"-";
if(month < 10)
clock+= "0";
clock += month + "-";
if(day < 10)
clock+= "0";
clock += day + " ";
if(hh < 10)
clock +="0";
clock += hh + ":";
if (mm < 10) clock +='0';
clock += mm;
return(clock);
}
18 【File】iOS的四種方法讀取文件內容
//第一種方法: NSFileManager實例方法讀取數據
NSArray*paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory,NSUserDomainMask, YES);
NSString*thepath = [paths lastObject];
thepath= [thepath stringByAppendingPathComponent:@"fd_list.txt"];
NSLog(@"桌面目錄:%@", thepath);
NSFileManager*fm = [NSFileManager defaultManager];
NSData*data = [[NSData alloc] init];
data= [fm contentsAtPath:thepath];
NSLog(@"%@",[[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding]);
//第二種方法: NSData類方法讀取數據
data= [NSData dataWithContentsOfFile:thepath];
NSLog(@"NSData類方法讀取的內容是:%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
//第三種方法: NSString類方法讀取內容
NSString*content = [NSString stringWithContentsOfFile:thepathencoding:NSUTF8StringEncoding error:nil];
NSLog(@"NSString類方法讀取的內容是:\n%@",content);
//第四種方法: NSFileHandle實例方法讀取內容
NSFileHandle*fh = [NSFileHandle fileHandleForReadingAtPath:thepath];
data= [fh readDataToEndOfFile];
NSLog(@"NSFileHandle實例讀取的內容是:\n%@", [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
http://www.2cto.com/kf/201404/290149.html
19 【編譯】Cannot define category forundefined class ‘NSString’
這個問題是由於默認沒有引用Foundation.h導致
解決方案:
在代碼中引用#import <Foundation/Foundation.h>
20 【View】-[UITableViewController loadView] loaded the"XXX" nib but didn't get a UITableView.
'-[UITableViewController loadView] loaded the"XXX" nib but didn't get a UITableView.'
解決方法:在頭文件中,將所繼承的父類UITableViewController 改成 UIViewController。
uncaught exception 'NSInternalInconsistencyException,reason:[UITableViewController loadView] loaded the "Controller" nibbut didn't get a UITableView
http://www.tuicool.com/articles/67VN3m