簡體   English   中英

NSArray對象和Casting

[英]NSArray of objects and Casting

我有一個帶有屬性NSString *name A類。 如果有一個NSArray並在這個數組中添加了許多A對象,那么每次檢索對象時都需要進行強制轉換嗎?

NSString* n = (NSString*)[arr objectAtIndex:1];

或者是否有另一種方法可以在java中使用ArrayList<A> arr

NSArray不存儲有關其中包含的對象類型的信息。 如果您確定數組中的對象類型,則可以隱式或顯式執行強制轉換:

NSString *n = [arr objectAtIndex:1];  // implicit type conversion (coercion) from id to NSString*
NSString *n = (NSString *)[arr objectAtIndex:1];  // explicit cast

隱式和顯式轉換之間的運行時成本沒有區別,只是風格問題。 如果你輸入的類型不對,那么很可能會發生的事情是你會將可怕的unrecognized selector sent to instance 0x12345678異常。

如果您有不同類型對象的異構數組,則需要使用isKindOfClass:方法來測試對象的類:

id obj = [arr objectAtIndex:1];
if ([obj isKindOfClass:[NSString class] ])
{
    // It's an NSString, do something with it...
    NSString *str = obj;
    ...
}

NSArrayobjectAtIndex:返回id類型的變量。 這將是大致相當於返回一個Object在Java的“我們不能保證許多關於這個變量的類型。” 但是,在Objective-C中,您可以在沒有編譯器抱怨的情況下向id變量發送消息。 因此,因為知道該數組只包含A實例,所以您最好向其發送name消息。 例如,以下內容將在沒有警告的情況下編譯:

NSString *name = [[array objectAtIndex:0] name];

但是,如果要使用點表示法(例如[array objectAtIndex:0].name ),則需要將id轉換為A * ,如下所示:

NSString *name = ((A *)[array objectAtIndex:0]).name;

這是做到這一點的方法。 實際上,您可以在不轉換返回的情況下執行上述操作,因為無論如何您都要將其讀入NSString。

這是方式:

NSMutableArray  *objectsArray = [[NSMutableArray  alloc] init];

A *a= [[A alloc] init];

[objectsArray addObject:a];

[a release];

您不必擔心屬性類型

暫無
暫無

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

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