NSArray簡單細說(三)—— 數組初始化

版本記錄

版本號 時間
V1.0 2017.08.24

前言

NSArray是集合類型中的一種,是OC中很重要的概念,這個是我們一定會用到的對象,下面我就繼續由整體到細節,由簡單到復雜的和大家說一下它的用法。感興趣的可以看我寫的上篇幾篇。
1. NSArray簡單細說(一)—— 整體了解
2. NSArray簡單細說(二)—— 數組的創建

一、 - (instancetype)init;

這個方法沒什么說的就是對象初始化函數,在以這種方式初始化了一個不可變數組之后,它不能被修改。所以一般不會NSArray用它進行初始化沒有意義。

結論:簡單到爆。


二、- (instancetype)initWithArray:(NSArray<ObjectType> *)array;

該方法的作用就是:通過給定的數組,初始化一個新的數組。在以這種方式初始化了一個不可變數組之后,它不能被修改。

下面看代碼

- (void)demoInitWithArray
{
    NSArray *givenArr = @[@1, @2, @3, @4, @5];
    NSArray *arr = [[NSArray alloc] initWithArray:givenArr];
    NSLog(@"arr = %@", arr);
}

下面看輸出結果

2017-08-24 23:39:21.848 JJOC[6849:191099] arr = (
    1,
    2,
    3,
    4,
    5
)

結論:簡單,了解。


三、- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;

該方法的作用就是:使用Array作為數組的數據對象的源初始化新分配的數組。

下面看一下參數和返回值:

  • array:一個包含對象的數組,用來初始化新的數組。
  • flag:如果是,數組中的每個對象都會接收到一個copyWithZone:消息來創建對象的副本必須符合NSCopying協議。 在內存管理環境中,這不是對象否則會接收到的保留消息。 然后將對象副本添加到返回的數組。如果否,則在內存管理環境中,數組中的每個對象在添加到返回的數組時都會收到一條保留消息。
  • return :初始化為包含對象的數組,或者如果標志為YES,則表示對象的數組。 返回的對象可能與原始接收者不同。

下面看一下代碼

- (void)demoInitWithArrayCopyItems
{
    NSArray *givenArr = @[@1, @2, @3, @4, @5];
    NSArray *arr = [[NSArray alloc] initWithArray:givenArr copyItems:YES];
    NSLog(@"arr = %@", arr);
}

下面看輸出結果

2017-08-24 23:52:15.553 JJOC[7246:203744] arr = (
    1,
    2,
    3,
    4,
    5
)

還有幾點需要注意:以這種方式初始化了一個不可變數組之后,它不能被修改。copyWithZone:方法執行淺拷貝。 如果你有一個任意深度的集合,那么對于flag參數傳遞YES就可以執行表面下面第一級的不可變拷貝。 如果您通過NO,第一級的可變性不受影響。 在任何一種情況下,所有更深層次的可變性都不受影響。

結論:簡單,了解。


四、- (NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;

該方法的作用就是:根據給定的路徑獲取新的數組。

下面看一下參數和返回值:

  • path:包含由writeToFile:atomically:方法生成的數組的表示形式的文件的路徑。
  • return:一個數組被初始化為包含由aPath指定的文件的內容,如果無法打開文件或文件的內容無法解析為數組,則該數組將被初始化為nil。 返回的對象可能與原始接收者不同。

下面看一下代碼

- (void)demoInitWithContentsOfFile
{
    NSArray *arr = [[NSArray alloc] initWithContentsOfFile:@"/Users/lucy/Desktop/demo/JJOC/JJOC/arrayTest.plist"];
    NSLog(@"arr = %@", arr);
}

下面看輸出結果

2017-08-25 00:02:10.074 JJOC[7690:214690] arr = (
    three,
    two,
    one
)

還有幾點需要注意:

  • aPath標識的文件中的數組表示形式只能包含屬性列表對象(NSString,NSData,NSArray或NSDictionary對象)。 這個數組包含的對象是不可變的,即使數組是可變的。

結論:簡單,了解。


五、- (NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;

該方法的作用就是:根據指定的URL初始化一個數組。

還有幾點需要注意:

  • 一個初始化為包含由aURL指定的內容的數組。 如果位置無法打開或位置的內容無法解析為數組,則返回nil。 返回的對象可能與原始接收者不同。
  • 由aURL標識的位置處的數組表示必須只包含屬性列表對象(NSString,NSData,NSArray或NSDictionary對象)。 這個數組包含的對象是不可變的,即使數組是可變的。

結論:簡單,了解。


六、- (instancetype)initWithObjects:(ObjectType)firstObj, ...;

該方法的作用就是根據參數列表實例化數組。

下面我們看一下參數和返回值:

  • firstObj :數組的第一個對象。
  • ... :以逗號分隔的其他對象列表,以nil結尾。
  • return:一個數組被初始化以包含參數列表中的對象。 返回的對象可能與原始接收者不同。

下面我們看一下代碼

- (void)demoInitWithObjects
{
    NSArray *arr = [[NSArray alloc] initWithObjects:[NSDate date], @1, @"hello", nil];
    NSLog(@"arr = %@", arr);
}

下面看輸出結果

2017-08-25 00:12:14.301 JJOC[7972:224593] arr = (
    "2017-08-24 16:12:14 +0000",
    1,
    hello
)

結論:簡單,了解。


七、- (instancetype)initWithObjects:(ObjectType _Nonnull const *)objects count:(NSUInteger)cnt;

該方法的作用就是:根據給定的C數組實例化一個新的數組。

下面我們看一下代碼:

- (void)demoInitWithObjectsCounts
{
    NSString *str[3];
    str[0] = @"0";
    str[1] = @"1";
    str[2] = @"2";
    NSArray *arr = [[NSArray alloc] initWithObjects:str count:2];
    NSLog(@"arr = %@", arr);
}

下面看輸出結果

2017-08-25 00:19:00.031 JJOC[8258:230150] arr = (
    0,
    1
)

這里還有幾點需要注意:

  • 元素將按照它們在對象中顯示的順序添加到新數組中,直到但不包括索引計數。在以這種方式初始化了一個不可變數組之后,它不能被修改。

結論:簡單,了解。

后記

未完,待續~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容