Objective c 目标C对象的C数组
我正在尝试使用malloc创建一个目标NSC字符串的C数组。我做得不对,但我认为我已经走得不远了。也许有人能给我指出正确的方向。 假设为了参数起见,数组中需要5个字符串 接口:Objective c 目标C对象的C数组,objective-c,c,malloc,Objective C,C,Malloc,我正在尝试使用malloc创建一个目标NSC字符串的C数组。我做得不对,但我认为我已经走得不远了。也许有人能给我指出正确的方向。 假设为了参数起见,数组中需要5个字符串 接口: @interface someObject : NSObject { NSString **ourArray; } @property () NSString **ourArray; @end 实施: @implementation someObject @synthesize ourArray; -(id)
@interface someObject : NSObject {
NSString **ourArray;
}
@property () NSString **ourArray;
@end
实施:
@implementation someObject
@synthesize ourArray;
-(id)init {
if((self = [super init])) {
self->ourArray = malloc(5 * sizeof(NSString *));
}
return self;
}
-(NSString *)getStringAtPos3 {
if(self.ourArray[3] == nil) {
self.ourArray[3] = @"a string";
}
return self.ourArray[3];
}
@end
当我在getStringAtPos3中设置断点时,它不会将数组元素视为nil,因此它永远不会进入if语句。我发现了问题所在-我应该使用calloc,而不是malloc。虽然malloc只是分配内存,但calloc 连续为count对象分配足够的空间,每个对象的大小为内存字节,并返回指向已分配内存的指针。分配的内存由值为零的字节填充
这意味着您将获得一个nil对象数组,基本上就像在objective c中0x0是nil对象一样。我解决了问题-我应该使用calloc,而不是malloc。虽然malloc只是分配内存,但calloc 连续为count对象分配足够的空间,每个对象的大小为内存字节,并返回指向已分配内存的指针。分配的内存由值为零的字节填充 这意味着您将获得一个nil对象数组,基本上就像在目标c中0x0是nil对象一样。一个问题是:
self->ourArray = malloc(5 * sizeof(NSString *)); // notice the sizeof()
一个问题是:
self->ourArray = malloc(5 * sizeof(NSString *)); // notice the sizeof()
malloc
ing指针数组的操作如下:
self->ourArray = malloc(5 * sizeof(NSString *));
if (self->ourArray == NULL)
/* handle error */
for (int i=0; i<5; i++)
self->ourArray[i] = nil;
malloc
ing指针数组的操作如下:
self->ourArray = malloc(5 * sizeof(NSString *));
if (self->ourArray == NULL)
/* handle error */
for (int i=0; i<5; i++)
self->ourArray[i] = nil;
不,不是这个意思。可能令人困惑的是,空指针不一定都是零,这就是
calloc
提供给您的。(它在i386上,但决不依赖它。)显式地将所有元素设置为null,并按照@chrisaycock的建议添加sizeof
。嗯,我不这么认为,larsmans。C99第6.3.2.3节,“值为0的整数常量表达式,或转换为void*类型的表达式,称为空指针常量。”和“宏null在(和其他标题)中定义为空指针常量;请参见7.17。”。7.17将NULL指定为“扩展为实现定义的NULL指针常量”的宏。因此,NULL在不同的实现中可以是0或(void*)0,但不能是1。@但这两个都是常量表达式@larsmans的观点是正确的,即不能保证NULL
将在内部用所有零位表示。也就是说,它在iOS/OS X上,对于那些系统来说依赖它是相当安全的。不过0x0是nil对象,所以如果calloc将指针分配为一组零,那么它肯定是nil对象吗?不管怎样,在i386和arm上使用calloc都是有效的。+1对于Justin:这条规则只适用于指针类型的常量表达式,而calloc
写入字节类型的零。在这种情况下,编译器会将0转换为当前平台的正确空指针。依赖null为全零是不可移植的,如果应用程序移动到其他平台,它可能会中断应用程序。不,这不是它的意思。可能令人困惑的是,空指针不一定都是零,这就是calloc
提供给您的。(它在i386上,但决不依赖它。)显式地将所有元素设置为null,并按照@chrisaycock的建议添加sizeof
。嗯,我不这么认为,larsmans。C99第6.3.2.3节,“值为0的整数常量表达式,或转换为void*类型的表达式,称为空指针常量。”和“宏null在(和其他标题)中定义为空指针常量;请参见7.17。”。7.17将NULL指定为“扩展为实现定义的NULL指针常量”的宏。因此,NULL在不同的实现中可以是0或(void*)0,但不能是1。@但这两个都是常量表达式@larsmans的观点是正确的,即不能保证NULL
将在内部用所有零位表示。也就是说,它在iOS/OS X上,对于那些系统来说依赖它是相当安全的。不过0x0是nil对象,所以如果calloc将指针分配为一组零,那么它肯定是nil对象吗?不管怎样,在i386和arm上使用calloc都是有效的。+1对于Justin:这条规则只适用于指针类型的常量表达式,而calloc
写入字节类型的零。在这种情况下,编译器会将0转换为当前平台的正确空指针。依赖null为全零是不可移植的,如果应用程序移动到其他平台,可能会中断应用程序。无需使用self->
。如果你这样做的话,它将给旧的hat ObjC开发人员提供配置单元。还要注意,指向Objective-C对象的指针的C数组是一种非常非典型的模式。只需使用NSArray
或nspointerray
即可。使用self->
有什么坏处?另外,我正在为iOS开发,它没有NSPointerArray
,但我想要一个动态大小的数组,可以有空条目。据推测,C数组速度也更快,不过在这种情况下不会有太大区别。不需要使用self->
。如果你这样做的话,它将给旧的hat ObjC开发人员提供配置单元。还要注意,指向Objective-C对象的指针的C数组是一种非常非典型的模式。只需使用NSArray
或nspointerray
即可。使用self->
有什么坏处?另外,我正在为iOS开发,它没有NSPointerArray
,但我想要一个动态大小的数组,可以有空条目。大概C数组也更快了,不过在这种情况下不会有太大的区别。是的,我只是在这里输入了示例,但错过了,谢谢。是的,我只是在这里输入了示例,错过了,谢谢。那么最好使用malloc还是calloc呢?calloc会返回所有nil对象。calloc
可能会返回平台上的所有nil
-对象,但不保证这一点;这是巧合。这是很好的风格