數組是一個有序的集合,OC中的數組只能存儲對象類型, 但是對於對象的類型沒有限制。
通過下標訪問數組元素,下標從0開始。
NSAa:不可變數組,即:對象創建好以后,數組中元素個數不能發⽣生變化。
初始化⽅方法
NSArray *names = [[NSArray alloc]initWithObjects:@"frank", @"duck", "monkey", nil];
注:nil作為數組存放元素的結束標志(nil在@"frank"后面時,代表數組中只有一個元素,雖然后面還有@"duck", "monkey"),多個元素通過逗號間隔。
便利構造器
NSArray *names = [NSArrayarrayWithObjects:@"frank", @"duck", @"monkey",nil];
注:和初始化方法相同的注意點
字面量賦初值:使用“ @[] ”,“ [] ”中存入對應的對象,對象之間使用”,”相隔。比如:
NSArray *names = @[@"frank", @"duck", @"monkey", @"cow"];
NSArray常用方法和屬性
元素個數 :
@property (readonly) NSUInteger count;
獲取數組中指定下標對應的元素
- (id)objectAtIndex:(NSUInteger)index;
字面量方式獲取元素:數組對象[元素下標]
names[0]
用來判斷數組中是否包含某一個給定的對象
- (BOOL)containsObject:(id)anObject;
獲取數組元素對應的索引
- (NSUInteger)indexOfObject:(id)anObject;
將數組中的元素按照給定的字符串格式拼接成一個完整的字符串

// - (NSString *)componentsJoinedByString: (NSString *)separator; //例:有一個數組,通過&將所有元素拼接成一個字符串 NSArray *array = @[@"北京", @"大連", @"河南", @"上海", @"廣州", @"⻄安"]; NSString *string = [array componentsJoinedByString:@"&"]; NSLog(@"%@", string);
注:NSString類相應的有componentsSeparatedByString:方法把字符串分離成數組。
數組類相關注意點:
1.數組中所有元素不能是基本數據類型,否則會編譯報錯,如果有需要封裝成NSNumber類或NSValue類。
2.數組在NSLog中可以作為對象直接輸出,此時建議重寫NSObject的-(NSString *)description方法(下面會給出具體代碼)
3.數組中可以存儲自定義類的對象,此時建議重寫NSObject的-(BOOL)isEqual:(id)object方法,原因在代碼后面講

1 #import <Foundation/Foundation.h> 2 3 @interface Father : NSObject 4 5 @property NSString *name; 6 @property NSInteger item; 7 8 @end

1 @implementation Father 2 3 -(NSString *)description{ 4 return [NSString stringWithFormat:@"value = %ld",_item]; 5 } 6 -(BOOL)isEqual:(id)object{ 7 if(object == self) 8 return YES; 9 if (!object) { 10 return NO; 11 } 12 if (![object isKindOfClass:[self class]]) { 13 return NO; 14 } 15 16 return [self isEqualToFather:object]; 17 } 18 19 - (BOOL)isEqualToFather:(Father *)aFather { 20 if (self == aFather) 21 return YES; 22 if (!([self item] == [aFather item])) 23 return NO; 24 return YES; 25 } 26 27 28 @end

1 int main(int argc, const char * argv[]) { 2 @autoreleasepool { 3 Father *f1 = [[Father alloc]init]; 4 f1.item = 10; 5 f1.name = @"name"; 6 7 Father *f2 = [[Father alloc]init]; 8 f2.item = 10; 9 f2.name = @"name"; 10 11 Father *f3 = [[Father alloc]init]; 12 f3.item = 10; 13 f3.name = @"name"; 14 15 sun *s = [[sun alloc] init]; 16 s.item = 10; 17 s.name = @"name"; 18 19 NSMutableArray *arr = [NSMutableArray arrayWithObjects:f1,f2,f1,@"test", nil]; 20 NSLog(@"%ld",[arr indexOfObject:s]); 21 22 [arr removeObject:f3]; 23 NSLog(@"%@",arr); 24 25 } 26 return 0; 27 }
大家可以自己看下測試結果
結論就是:1.自定義類在格式化字符串中會調用自己的description方法(其實系統類也是,系統類也是重寫了這個方法,包括NSString類)。
2.在indexOfObject和removeObject等需要判斷兩個對象是否相等的方法中,會調用繼承自NSObject的isEqual方法(此方法建議重寫)。
下面會詳細討論下數組的排序