由于NSSstring的长度没有像integer或double那样定义,我是否会冒着使用malloc为它分配NSStrings数组的问题?
感谢
即:
NSString ***nssName;
nssName = (NSString***) malloc(iN * sizeof(NSString*));
行的for_loops的最终结果是一个2D数组,所以它比NSArray(更少的代码)更容易工作。
答案 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 ?