Iphone 物体和铸件的排列
我有一个类Iphone 物体和铸件的排列,iphone,objective-c,ios,Iphone,Objective C,Ios,我有一个类a,它有一个属性NSString*name。如果有一个NSArray并将许多A对象添加到此数组中,每次检索对象时是否需要强制转换?i、 e NSString* n = (NSString*)[arr objectAtIndex:1]; 或者有没有另一种方法可以做到这一点,就像在java中有ArrayList arr?这就是方法。实际上,您可以在不强制转换返回值的情况下执行上述操作,因为您正在将其读入NSString。以下是方法: NSMutableArray *objectsArr
a
,它有一个属性NSString*name
。如果有一个NSArray
并将许多A
对象添加到此数组中,每次检索对象时是否需要强制转换?i、 e
NSString* n = (NSString*)[arr objectAtIndex:1];
或者有没有另一种方法可以做到这一点,就像在java中有
ArrayList arr
?这就是方法。实际上,您可以在不强制转换返回值的情况下执行上述操作,因为您正在将其读入NSString。以下是方法:
NSMutableArray *objectsArray = [[NSMutableArray alloc] init];
A *a= [[A alloc] init];
[objectsArray addObject:a];
[a release];
您不必担心适当的类型
NSArray
的objectAtIndex:
返回类型为id
的变量。这大致相当于在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;
NSArray
不存储有关其中包含的对象类型的信息。如果您确实知道数组中对象的类型,则可以隐式或显式执行强制转换:
NSString *n = [arr objectAtIndex:1]; // implicit type conversion (coercion) from id to NSString*
NSString *n = (NSString *)[arr objectAtIndex:1]; // explicit cast
隐式强制转换和显式强制转换在运行时成本上没有区别,这只是风格的问题。如果您得到的类型错误,那么很可能会发生的是,您将得到可怕的无法识别的选择器发送到实例0x12345678
异常
如果具有不同类型对象的异构数组,则需要使用该方法测试对象的类:
id obj = [arr objectAtIndex:1];
if ([obj isKindOfClass:[NSString class] ])
{
// It's an NSString, do something with it...
NSString *str = obj;
...
}
值得注意的是,在运行时无法区分NSStrings和NSMutableStrings——它们都对
isKindOfClass:[NSMutableString class]
@Chuck:我不知道。为什么?@Chuck:我注意到NSString还返回YES到[myNSString respondsToSelector:@“appendFormat:;
。ISTM可变字符串和不可变字符串都是由u NSCFString实现的,并且有一些内部标志告诉它是否可变。如果调用[myNSString appendFormat:@“world”]
您会得到一个异常,但不是一个表明它不响应选择器的异常。显然,appendFormat:
会检查不可变标志,如果设置了,它会引发异常。可变字符串和不可变字符串实际上是同一个类,\uuu NSCFString
@Chuck:好的,还有\uuu NSCFConstantString
,对于字符串文本。@Rudy:你说得对。它们都是在“CFString”之上实现的,你可以使用它的代码;它确实有一个可变标志。一些(全部?)变异函数调用cfassertesstringandmutable()
,正如您可能猜到的,它使用CFAssert
来检查字符串是否可变。实际上,不,添加到数组中会保留对象,因此在该片段之后,您的保留数为+2,因此您实际上需要删除该项并释放它,以便它不会泄漏,所有这些都是不好的做法,我应该说t他的代码可能会导致泄漏。Daniel正确地指出,这是一种糟糕的风格。只有一个引用是通过数组引用的A
,但是数组和alloc
ing代码都有所有权声明。/cc@ChuckOh,非常抱歉。漫长的一天。忽略我。Thx指出这一点:但这不是真的说到点子上了!太好了……这正是我要找的信息