Иногда я хочу вернуть массив чего-то, я знаю, что я должен сделать, чтобы вызывающий мог сделать массив и модифицировать массив в методе. Но, оказывается, это работает?return fixed size array
@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
это просто указатель. Итак, вопрос в том, могу ли я безопасно возвращать массив вроде этого? где находится массив, выделенный в? В стеке функции вызова или в стеке функции звонящего? Верно ли, что весь массив скопирован из функции callee или как struct complier распределяет массив в функции вызывающего абонента автоматически?
Я использую Xcode 4.6.2
Update
Похоже, это только ковшики для 32бит приложение, которое включает в себя IOS приложение (ARM), IOS симулятор (x86) и 32-битный OSX приложение.
Пожалуйста, конденсируйте код, чтобы он просто показывал вашу проблему. Не ожидайте, что люди пройдут через десятки строк в поисках базового вопроса, подобного этому. –
@ смысл-имеет значение моя проблема: могу ли я сделать CGPoint * ps = [t test]; ', это недостаточно ясно? –