iOS 基礎

字符串

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;

UITableviewcell的性能問題
cell的工作:iOS設備的內存有限,如果用UITableView顯示成千上萬條數據,就需要成千上萬 個UITableViewCell對象的話,那將會耗盡iOS設備的內存。要解決該問題,需要重用UITableViewCell對象.
解決⽅方案:UITableViewCell有個NSString *reuseIdentifier屬性,可以在初始化UITableViewCell的時候傳入一個特定的字符串標識來設置reuseIdentifier(一般用UITableViewCell的類名)。當UITableView要求dataSource返回UITableViewCell時,先 通過一個字符串標識到對象池中查找對應類型的UITableViewCell對象,如果有,就重用,如果沒有,就傳入這個字符串標識來初始化⼀一個UITableViewCell對象。

緩存優化的思路:

(1)先去緩存池中查找是否有滿足條件的cell,若有那就直接拿來

(2)若沒有,就自己創建一個cell

(3)創建cell,並且設置一個唯一的標記(把屬於“”的給蓋個章)

(4)給cell設置數據

刷新:

- (void)reloadData;   //重新加載所有數據

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation //刷新一行cell信息

注意點:

定義變量用來保存重用標記的值,這裏不推薦使用宏(#define來處理),因爲該變量只在這個作用域的內部使用,且如果使用宏定義的話,定義和使用位置太分散,不利於閱讀程序。由於其值不變,沒有必要每次都開闢一次,所以用static定義爲一個靜態變量。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 定義變量保存重用標記的值
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;};
例如 int (^square_block)(int num) = ^(int num) {return (num*num);};
注意:變量時本地的,代碼塊會在定義時複製並保存它們的狀態。
typedef double (^MKSampleMultiBlockRef) (void);
double a=10,b=20;
MKSampleMultiBlockRef multi= ^(void){ return a*b; };
NSLog(@"%f", multi());//200
a=20,b=50;
NSLog(@"%f", multi()); //200 而不是1000 如果a,b是全局變量則是1000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章