[英]Correct syntax for accessing c-style object array through objective-c messaging?
[英]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和變量/指針指針的更多詳細信息,請參閱ARC和NSError中的 處理指針到指針所有權問題 以及__autoreleasing 。
用於常數陣列
雖然不是原始問題的一部分,但很明顯很多人使用C數組作為在Objective-C中擁有字符串常量數組的方法。 對於這個特殊用途觀察:
如果將數組和參數類型聲明為對字符串的常量引用數組,則無法更改數組元素;
使數組靜態也將確保它只創建和初始化一次,即使用函數聲明; 和
如果您的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.