高效的把NSMutableArray變成NSArray

來源:互聯網
上載者:User

標籤:nsmutablearray   nsarray   object   objective-c   

高效的把NSMutableArray變成NSArray

我們在方法內部可能會用NSMutableArray,但是返回的時候希望其他人不去改我們的Array

   NSMutableArray *array1 = [@[] mutableCopy];    for (int i = 0; i < 10000000; i++)    {        [array1 addObject:@(i)];    }    return array1;

這個時候我們通常的做法是拷貝array1或者是產生一個新的array1

return [array1 copy];return [NSArray arrayWithArray:array1];

這裡呢,我們列印了下時間

    NSMutableArray *array1 = [@[] mutableCopy];    NSMutableArray *array2 = [@[] mutableCopy];    PERF_ENTER_(init)    for (int i = 0; i < 10000000; i++)    {        [array1 addObject:@(i)];        [array2 addObject:@(i)];    }    PERF_LEAVE_(init)    PERF_ENTER_(copy)    NSArray *array3 = [array1 copy];    PERF_LEAVE_(copy)    NSLog(@"%@", [array3 class]);    PERF_ENTER_(arrayWithArray)    NSArray *array4 = [NSArray arrayWithArray:array1];    PERF_LEAVE_(arrayWithArray)    NSLog(@"%@", [array4 class]);/*    2015-01-07 00:57:36.869 JoinShow[1134:68543] +[XYPerformance recordName:andTime:] 'init' = 5.492105(s)2015-01-07 00:57:37.125 JoinShow[1134:68543] +[XYPerformance recordName:andTime:] 'copy' = 0.255650(s)2015-01-07 00:57:37.125 JoinShow[1134:68543] __NSArrayI2015-01-07 00:57:37.373 JoinShow[1134:68543] +[XYPerformance recordName:andTime:] 'arrayWithArray' = 0.247696(s)2015-01-07 00:57:37.373 JoinShow[1134:68543] __NSArrayI*/

發現正常拷貝一個大array需要0.2s,這已經是不能忍的時間了.需要對方法進行最佳化.

問題的本質是什麼,是我們需要返回一個不可變的array,因此我們可以直接把 NSMutableArray 對象的isa 修改成 NSArray.

- (NSArray *)immutable{    object_setClass(self, [NSArray class]);    return self;}    PERF_ENTER_(immutable)    NSArray *array5 = [array2 immutable];    PERF_LEAVE_(immutable)    NSLog(@"%@", [array5 class]);/*2015-01-07 00:57:37.373 JoinShow[1134:68543] +[XYPerformance recordName:andTime:] 'immutable' = 0.000030(s)2015-01-07 00:57:37.373 JoinShow[1134:68543] NSArray*/

看下時間,果然快很多.

高效的把NSMutableArray變成NSArray

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.