如何实现 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?的主要内容,如果未能解决你的问题,请参考以下文章