有时我想返回一个数组,我知道我应该做什么让调用者制作数组并在方法中修改数组。但事实证明这行得通?
@interface Test : NSObject
@end
@implementation Test
- (CGPoint[2])test {
CGPoint p1 = {1, 2};
CGPoint p2 = {3, 4};
return (CGPoint[2]) {p1, p2};
}
- (int[2])test2 {
int i = 1;
int i2 = 2;
return (int[2]){i, i2};
}
- (int[5])test3 {
int i = 1;
int i2 = 2;
return (int[5]){i, i2, 3, 4, 5};
}
@end
@implementation testTests
- (void)testExample
{
Test *t = [Test new];
CGPoint p = [t test][0];
CGPoint p2 = [t test][1];
CGPoint *ps = [t test];
CGPoint p3 = ps[0];
CGPoint p4 = ps[1];
NSLog(@"%@ %@ %@ %@", NSStringFromCGPoint(p), NSStringFromCGPoint(p2), NSStringFromCGPoint(p3), NSStringFromCGPoint(p4));
// {1, 2} {3, 4} {1, 2} {3, 4}
{
Method m = class_getInstanceMethod([Test class], @selector(test));
const char *rettype = method_copyReturnType(m);
NSUInteger size = 0;
NSGetSizeAndAlignment(rettype, &size, NULL);
NSLog(@"%s %d", rettype, size); // [2{CGPoint=ff}] 16
}
{
Method m = class_getInstanceMethod([Test class], @selector(test2));
const char *rettype = method_copyReturnType(m);
NSUInteger size = 0;
NSGetSizeAndAlignment(rettype, &size, NULL);
NSLog(@"%s %d", rettype, size); // [2i] 8
}
{
Method m = class_getInstanceMethod([Test class], @selector(test3));
const char *rettype = method_copyReturnType(m);
NSUInteger size = 0;
NSGetSizeAndAlignment(rettype, &size, NULL);
NSLog(@"%s %d", rettype, size); // [5i] 20
}
}
@end
所以看起来我可以直接返回一个数组,比如返回一个结构。正如所NSGetSizeAndAlignment
建议的,返回值实际上是整个数组,而不仅仅是一个指针。(16 个CGPoint[2]
,8个int[2]
,20 个int[5]
)
但是要实际使用返回值,我只能这样做
CGPoint *ps = [t test];
这里ps
只是一个指针。所以问题是我可以像这样安全地返回数组吗?数组分配在哪里?在被调用函数堆栈中还是在调用函数堆栈中?整个数组是从被调用函数复制的,还是像 struct 编译器自动在调用函数中分配数组一样是真的吗?
我正在使用 Xcode 4.6.2
更新
看起来这只适用于 32 位应用程序,其中包括 iOS 应用程序 (ARM)、iOS 模拟器 (x86) 和 32 位 OSX 应用程序。