В Obj-C, если вы выделили объект с помощью вызова alloc
, стандартная практика заключается в том, чтобы автоматически высвобождать этот объект перед возвратом и называть метод так, чтобы вызывающая сторона знала, что он получает объект, который автоматически высвобождается. Если вызывающий абонент нуждается в этом, он может снова сохранить этот объект.
- (MyClass *)getMyAutoreleasedObject {
MyClass *obj = [[MyClass alloc] init];
return [obj autorelease]; // caller needs to retain if needed
}
А если у вас нет автоматического выпуска, вы должны назвать метод таким образом, чтобы вызывающая сторона знала, что он должен освободить возвращенный объект. Это строго соблюдаемое соглашение в Obj-C.
В C, если вы выделяете память в стеке, эта память недопустима в вызывающей программе.
int *func() {
int a[100];
return a; // invalid in caller
}
В вашем примере та же проблема. Возвращенная память недействительна в вызывающей. В этом случае вы можете выделить память динамически, и вызывающий должен освободить ее, когда закончите.
int *func() {
int *a = (int *) malloc (100 * sizeof(int));
return a; // caller must free(a)
}