使用malloc分配NSStrings数组?

时间:2011-07-19 15:43:12

标签: objective-c cocoa-touch

由于NSSstring的长度没有像integer或double那样定义,我是否会冒着使用malloc为它分配NSStrings数组的问题?

感谢

即:

NSString ***nssName;
nssName = (NSString***) malloc(iN * sizeof(NSString*));

行的for_loops的最终结果是一个2D数组,所以它比NSArray(更少的代码)更容易工作。

5 个答案:

答案 0 :(得分:3)

由于NSString是一个对象(更准确地说是一个对象集群),你无法知道它在内存中的最终大小,只有Objective-C可以。所以你需要使用Objective-C分配方法(比如[[NSString alloc] init]),你不能使用malloc

问题还在于NSString是一个对象集群,这意味着你没有获得NSString的实例,而是一个子类(你可能根本不知道也不应该关心) 。例如,真正的类经常是NSCFString,但是一旦你调用了一些处理字符串的方法,就像路径一样,你会得到一个NSPathStore2或其他的实例。可以将NSString init方法视为工厂(如工厂模式)。

问题编辑后:

你真正想要的是:

NSString **nssName;
nssName = (NSString**) malloc(iN * sizeof(NSString*));

然后像:

nssName[0] = @"My string";
nssName[1] = [[NSString alloc] init];
...

这很好,因为你有一个指针数组,指针的大小当然是已知的。

但要注意内存管理:首先,你应该确保数组填充了NULL,例如使用bzero或使用calloc

bzero(nssName, iN * sizeof(NSString*));

然后,在你free数组之前,你需要release数组中的每个字符串(并确保你不存储自动释放的字符串;你需要先保留它们。)

总而言之,你在这里有更多的陷阱。您可以走这条路线,但使用NSArray会更容易处理。

答案 1 :(得分:3)

不会出现任何问题,分配NSStrings数组就像创建一个指向字符串对象的指针数组。指针是一个恒定的长度。我建议只使用NSArray,但使用NSStrings的C数组仍然可以。请注意,这可能已随ARC更改。

以下是完全可以接受的代码:

NSString** array = malloc(sizeof(NSString*) * 10); // Array of 10 strings
array[0] = @"Hello World"; // Put on at index 0
NSLog(@"%@", array[0]); // Log string at index 0

答案 2 :(得分:2)

NSStrings只能通过指针来处理,所以你只需要创建一个指向NSString的指针数组。指针有一个确定的长度,所以很有可能。但是,NSArray通常是更好的选择。

答案 3 :(得分:0)

您应该alloc / init... NSString*或使用班级的工厂方法。如果您需要一组数组,请尝试NSArray*

答案 4 :(得分:0)

您不应该使用malloc为Objective-C类型分配数据。这样做会分配内存空间,但不会分配其他内容。最重要的是,对象不会被初始化,并且几乎同样重要的是不会设置对象的保留计数。这只是在问问题。您是否有任何理由不想使用 alloc init