OC中數組類NSArray的詳解,常用屬性和方法(一)


數組是一個有序的集合,OC中的數組只能存儲對象類型, 但是對於對象的類型沒有限制。

通過下標訪問數組元素,下標從0開始。 

NSA􏰀􏰀a􏰁:不可變數組,即:對象創建好以后,數組中元素個數不能發⽣生變化。 

初始化⽅方法 

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);
View Code

注: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
Father類接口
 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
Father類實現

 

 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 }
main函數測試代碼

大家可以自己看下測試結果

結論就是:1.自定義類在格式化字符串中會調用自己的description方法(其實系統類也是,系統類也是重寫了這個方法,包括NSString類)。

             2.在indexOfObject和removeObject等需要判斷兩個對象是否相等的方法中,會調用繼承自NSObject的isEqual方法(此方法建議重寫)。

 

 下面會詳細討論下數組的排序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM