Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 物体和铸件的排列_Iphone_Objective C_Ios - Fatal编程技术网

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指出这一点:但这不是真的说到点子上了!太好了……这正是我要找的信息