如何实现 initWithCString:(const char *)nullTerminatedCString ?为啥大多数人使用 allocWithZone 而不是 alloc?

Posted

技术标签:

【中文标题】如何实现 initWithCString:(const char *)nullTerminatedCString ?为啥大多数人使用 allocWithZone 而不是 alloc?【英文标题】:How to implement initWithCString:(const char *)nullTerminatedCString ? why most people use allocWithZone instead of alloc?如何实现 initWithCString:(const char *)nullTerminatedCString ?为什么大多数人使用 allocWithZone 而不是 alloc? 【发布时间】:2015-10-13 03:02:34 【问题描述】:

我对“如何实现initWithCString:(const char *)nullTerminatedCString”的问题有疑问。

我搜索了这个问题的许多答案。他们中的大多数使用 allocWithZone 而不是 alloc,但据我所知,NSZone 由于某种原因被苹果放弃了。 大多数人编写代码来实现这个方法是这样的:

+ (id) stringWithCString: (const char*)nullTerminatedCString 
            encoding: (NSStringEncoding)encoding

  NSString  *obj;
  obj = [self allocWithZone: NSDefaultMallocZone()];
  obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
  return AUTORELEASE(obj);

我不明白他们为什么不这样写:

+ (id) stringWithCString: (const char*)nullTerminatedCString 
            encoding: (NSStringEncoding)encoding

  NSString  *obj;
  obj = [self alloc];
  obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
  return AUTORELEASE(obj);

我的方法有什么问题吗,谁能告诉我?

【问题讨论】:

【参考方案1】:

That method already exists as part of the SDK on NSString,所以我不确定你为什么要实现它。话虽如此,您在上面提供的两个实现是等效的。 As noted in the documentation、alloc 实际上调用了allocWithZone:

The documentation for allocWithZone: 还表示alloc 可能是首选。它指出:

This method exists for historical reasons; memory zones are no longer used by Objective-C.

【讨论】:

先谢谢你的回答。我不想实现它的原因是我有一个面试问题,但我真的不明白它的答案,因为他们都使用allocWithZone而不是alloc,所以我不想知道他们为什么这样做。所以你的意思是,我可以使用这样的代码吗? obj = [自我分配]; obj = [obj initWithCString: nullTerminatedCString encoding: encoding];实现此方法是否正确? 根据文档,我会说调用[self alloc][self allocWithZone:NSDefaultMallocZone()] 更正确。 The documentation for allocWithZone: 声明“由于历史原因存在此方法;Objective-C 不再使用内存区域。”

以上是关于如何实现 initWithCString:(const char *)nullTerminatedCString ?为啥大多数人使用 allocWithZone 而不是 alloc?的主要内容,如果未能解决你的问题,请参考以下文章

Java实现一个HTTP基于xml的post请求 如何在struts2 action获取

iOS知识点面试题 之三

如何在严格评估的语言中实现保护递归?

在类中初始化NSString *指针的方法

eval实现字符串化前的功能实现,有效叠加相同代码

js如何实现点击第一次时清空原有文本框内容,输入文字后再点击不清空其中内容