簡體   English   中英

用於傳遞NS樣式的c風格數組的Objective-c語法

[英]Objective-c syntax for passing a c-style array of NSStrings

將包含NSString*的c風格數組傳遞給objective-c方法的最佳語法是什么? 這是我目前正在使用的:

- (void) f:(NSString **) a {

}

- (void) g {
    NSString* a[2] = {@"something", @"else"};
    [self f:a];
}

您唯一的其他選擇如下:

- (void) f:(NSString* []) a {

}

編譯時它是相同的。 我不知道“最好”,但我更喜歡這個版本的可讀性。 更容易推斷出你傳遞的指針是用作數組的。 指針的指針在其他地方有不同的用法(請參閱iOS SDK中使用的各種NSError**參數),因此區別很有幫助。

稍微好一點是:

- (void) f:(NSString *[]) a

因為它清楚地表明它期望一個引用NString的數組(通過引用傳遞),而不是對NString的引用的引用。

但是,這很可能不會改變編譯器的類型檢查,你可以毫無問題地傳遞NSString ** 如果添加邊界也是如此:

- (void) f:(NSString *[2]) a

在這里,編譯器很可能只是忽略2 - 無論是在調用時還是在體內,你只需添加一個“注釋”。 (如果要傳遞多維數組,則需要指定除最后一個索引之外的所有數組。)

附錄

Mike Keskinov提示(見評論)

更新ARC

根據ARC,問題中的聲明:

NSString* a[2] = {@"something", @"else"};

沒有明確的所有權限定符被視為:

NSString* __strong a[2] = {@"something", @"else"};

這是一個對字符串的強引用數組。 當傳遞一個指向變量本身的指針時,在這種情況下是指向數組的指針,編譯器需要知道指向變量的所有權限定。 在編寫指向數組的情況下,編譯器沒有默認值,因此上面的答案中的聲明如下:

- (void) f:(NSString *[]) a

將產生錯誤,正如Mike Keskinov在下面的評論中所報告的那樣,您必須插入一個明確的所有權限定符:

- (void) f:(NSString * __strong []) a

使用該信息,編譯器知道如何自動處理數組中的字符串引用 - 在f的主體中,編譯器將根據需要自動保留並釋放NSString引用。

有關ARC和變量/指針指針的更多詳細信息,請參閱ARCNSError中的 處理指針到指針所有權問題 以及__autoreleasing

用於常數陣列

雖然不是原始問題的一部分,但很明顯很多人使用C數組作為在Objective-C中擁有字符串常量數組的方法。 對於這個特殊用途觀察:

  1. 如果將數組和參數類型聲明為對字符串的常量引用數組,則無法更改數組元素;

  2. 使數組靜態也將確保它只創建和初始化一次,即使用函數聲明;

  3. 如果您的C數組只包含字符串文字,則不需要默認的__strong所有權限定符,因為字符串文字是不朽的。 而是可以使用__unsafe_unretained限定符,數組中的引用將始終有效。

這些產生代碼片段:

static NSString * const __unsafe_unretained a[2] = {@"something", @"else"}; 

和:

- (void) f:(NSString * const __unsafe_unretained[]) a

你的目標是不斷的NSString文字常量數組。 編譯器不允許修改陣列,也不允許插入冗余內存管理調用。

最好的方法是使用NSArray而不是c風格的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM