字符串
Objective-C 指定字符串的約定與C相同:單個字符會使用單引號括起來,而字符串則使用雙引號括起來。但是,Objective-C框架通常不使用C字符串。相反,它們會使用NSString對象。
NSString類爲字符串提供了一個對象包裝器,它具有諸多優勢,如內置了可用於儲存任意長度字符串的內存管理、提供了對各種字符編碼(特別是Unicode)的支持,以及用於格式化字符串的實用工具等。因爲您通常會使用此類字符串,所以Objective-C提供了速寫記法,即根據常量值來創建NSString對象。要使用此NSString字面常量,只需在雙引號字符串前面添加(@)符號,
NSString *myString =@"My String\n";
NSLog(@"%@",myString);
NSString *anotherCString = [NSStringstringWithFormat:@"%d %@" ,1,@"String"];
NSLog(@"%@",anotherCString);
NSString *fromCSting = [NSStringstringWithCString:"A C string"encoding:NSUTF8StringEncoding];
NSLog(@"%@",fromCSting);
2015-06-25 14:31:41.572 testStoryBoard[3270:157238] My String
2015-06-25 14:31:41.574 testStoryBoard[3270:157238] 1 String
2015-06-25 14:31:41.574 testStoryBoard[3270:157238] A C string
數字
Objective-C 提供了創建NSNumber對象的速寫記法,從而無需調用初始化程序或類工廠方法就可以創建此類對象。只需在數值前面添加(@)符號,並選擇一個添加在其後面的值類型指示。例如,創建封裝整數值和雙精度值的NSNumber對象,可以編寫如下代碼:
+(NSNumber *) numberWithChar: (char) value;
+(NSNumber *) numberWithInt: (int) value;
+(NSNumber *) numberWithFloat: (float) value;
+(NSNumber *) numberWithBool: (BOOL) value;
- (char) charValue;
- (int) intValue;
- (float) floatValue;
- (BOOL) boolValue;
- (NSString *) stringValue;
NSNumber *myIntValue =@32;
NSNumber *myDoubleValue =@3.2233123;
NSLog(@"%d",myIntValue.intValue);
NSLog(@"%f",myDoubleValue.doubleValue);
2015-06-25 14:40:35.806 testStoryBoard[3407:161867] 32
2015-06-25 14:40:35.807 testStoryBoard[3407:161867] 3.223312
您甚至可以使用 NSNumber字面常量來創建封裝的Boolean值和字符值。
NSNumber *myBoolValue =@YES;
NSNumber *myCharValue = @'V';
NSLog(@"%d",myBoolValue.boolValue);
NSLog(@"%c",myCharValue.charValue);
2015-06-25 14:40:35.807 testStoryBoard[3407:161867] 1
2015-06-25 14:40:35.807 testStoryBoard[3407:161867] V
可以創建 NSNumber對象,表示無符號整型(unsigned integers)、長整型(long integers)、長長整型(longlong integers) 和浮點值 (float values),方法是將字符“U”、“L”、“LL”和“F”分別追加到記號值末尾。例如,創建封裝浮點值的NSNumber對象,可以編寫如下代碼:
NSNumber *myFloatValue =@3.2F;
NSLog(@"%f",myFloatValue.floatValue);
2015-06-25 14:40:35.807 testStoryBoard[3407:161867] 3.200000
數組
數組 (NSArray)用於表示有序的對象列表。只要求每個項目都是Objective-C對象;不要求每個對象都是同一個類的實例。 如果要保持數組中的順序,每個元素都應儲存在從0開始的索引中。NSArray類有兩個限制:1. 只能存儲Objective-c對象,而不能存儲原始的C語言基礎類型,如int,float,enum,struct和NSArray中的隨機指針. 2.不能存儲NIL
創建數組
+ (id)arrayWithObject:(id)anObject;
+ (id)arrayWithObjects:(id)firstObject, ...,nil;
如果所提供的其中一個值爲nil,則有可能使項目列表意外截斷。
id firstObject = @"someString";
id secondObject = nil;
id thirdObject = @"anotherString";
NSArray *someArray =
[NSArray arrayWithObjects:firstObject, secondObject, thirdObject, nil];
查詢數組對象
NSUInteger numberOfItems = [someArray count];
排序數組對象
NSArray類提供了多種方法對其收集的對象進行排序。由於NSArray是不可變的,因此這類方法都會返回新的數組,並在其中包含排好序的項目。
NSArray *unsortedStrings = @[@"gammaString", @"alphaString", @"betaString"]; NSArray *sortedStrings = [unsortedStrings sortedArrayUsingSelector:@selector(compare:)];
可變性
雖然 NSArray類本身不可變,但它仍可包含可變對象。例如,如果將可變字符串添加到不可變的數組 。
如果要在初始創建數組後添加或移除對象,可使用 NSMutableArray,它提供了很多方法來添加、移除或替換一個或多個對象。
NSMutableArray *mutableArray = [NSMutableArray array];
[mutableArray addObject:@"gamma"];
[mutableArray addObject:@"alpha"];
[mutableArray addObject:@"beta"];
[mutableArray replaceObjectAtIndex:0 withObject:@"epsilon"];
[mutableArray sortUsingSelector:@selector(caseInsensitiveCompare:)];
集合
因爲集合不包含順序,用了以 nil 結束且數量不固定的參數。可變的 NSSet 子類名稱是 NSMutableSet。
NSSet *simpleSet = [NSSet setWithObjects:@"Hello, World!", @42, aValue, anObject, nil];
即使您多次嘗試添加對象,集合也只會儲存對單個對象的一次引用。
NSNumber *number = @42;
NSSet *numberSet =
[NSSet setWithObjects:number, number, number, number, nil];
// numberSet only contains one object
字典
創建字典
對於dictionaryWithObjectsAndKeys:和initWithObjectsAndKeys:方法,每個對象都會在其鍵前進行聲明,並且對象列表和鍵必須以nil結束。
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
someObject,@"anObject",
@"Hello, World!",@"helloString",
@42,@"magicNumber",
someValue,@"aValue",
nil];
或 NSDictionary *dictionary =@{
@"anObject" : someObject,
@"helloString" :@"Hello, World!",
@"magicNumber" :@42,
@"aValue" : someValue
}
查詢字典
如果找不到該對象,objectForKey: 方法會返回 nil。 NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];
同樣也可以用下標語法來替代 objectForKey:。
NSNumber *storedNumber = dictionary[@"magicNumber"];
可變性
創建字典後,如果需要添加或移除對象,可使用 NSMutableDictionary 子類。
[dictionary setObject:@"another string" forKey:@"secondString"];
[dictionary removeObjectForKey:@"anObject"];
使用 NSNull 表示 nil
因爲在 Objective-C 中,nil 表示 “無對象” 。因此不可能將 nil 添加到此節所描述的集類中。如果要在集
(collection) 中表示“無對象”,應使用 NSNull 類。
NSArray *array = @[ @"string", @42, [NSNull null] ];
使用 NSNull,null 方法始終都會返回相同的實例。按此方式工作的類稱爲單例類。
類
您可以使用 getter 和 setter 來訪問屬性。getter 返回屬性的值,setter 更改屬性的值。訪問 getter 和setter 的常見語法簡寫是 dot notation(點表達式)。對於具有讀寫訪問權限的屬性,您可以使用點表達式來獲取和設定屬性的值。
toDoItem.itemName = @"Buy milk"; //Sets the value of itemName
NSString *selectedItemName = toDoItem.itemName; //Gets the value of itemName
方法名稱前面的減號 (-) 指示它是一個實例方法,可以用該類的對象調用。
方法用加號 (+) 表示類方法,可通過類本身來調用。
TableView
tableView:cellForRowAtIndexPath: 表格視圖中僅顯示行的單元格的請求
展示數據的過程:
(1)調用數據源的下面⽅法得知⼀一共有多少組數據
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
(2)調用數據源的下面⽅法得知每一組有多少行數據
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
(3)調⽤數據源的下⾯⽅法得知每⼀⾏顯示什麼內容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
(1)先去緩存池中查找是否有滿足條件的cell,若有那就直接拿來
(2)若沒有,就自己創建一個cell
(3)創建cell,並且設置一個唯一的標記(把屬於“”的給蓋個章)
(4)給cell設置數據
刷新:
- (void)reloadData; //重新加載所有數據
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation //刷新一行cell信息
注意點:定義變量用來保存重用標記的值,這裏不推薦使用宏(#define來處理),因爲該變量只在這個作用域的內部使用,且如果使用宏定義的話,定義和使用位置太分散,不利於閱讀程序。由於其值不變,沒有必要每次都開闢一次,所以用static定義爲一個靜態變量。
{
// 定義變量保存重用標記的值
static NSString *identifier = @"hero";
// 1.先去緩存池中查找是否有滿足條件的Cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
// 2.如果緩存池中沒有符合條件的cell,就自己創建一個Cell
if (cell == nil) {
// 3.創建Cell, 並且設置一個唯一的標記
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
NSLog(@"創建一個新的Cell");
}
// 4.給cell設置數據
NJHero *hero = self.heros[indexPath.row];
cell.textLabel.text = hero.name;
cell.detailTextLabel.text = hero.intro;
cell.imageView.image = [UIImage imageNamed:hero.icon];
// NSLog(@"%@ - %d - %p", hero.name, indexPath.row, cell);
// 3.返回cell
return cell;
}
代碼塊
<return type> (^blockname)(list of arguments) = ^(arguments){body;};