目前,我对Objective-C的一个小理解问题感到困扰。作为Aaron Hillegass的书之后的例子,我想知道在类的NSString
方法中为init
分配一个值,就像在这个例子中一样(对于知道这本书的人,这在{ {1}} RaiseMan类:
Person
这个字符串不是由我分配的,所以通常我不应该为释放它而烦恼。
BUT!在这个字符串的setter方法中会发生什么?遵循内存管理规则,该方法应如下所示:
- (id)init
{
if(![super init])
return nil;
myString = @"New entry";
return self;
}
为什么- (void)setMyString:(NSString *)newString
{
if(myString != newString) {
[myString release];
[newString retain];
myString = newString;
}
}
有效?我在某处读过,[myString release]
分配的字符串无法释放。
正在以= @"bla"
正确的方式进行初始化?或者我应该使用= @"bla"
和alloc
代替吗?
感谢您的帮助:)
答案 0 :(得分:3)
AFAIK,形式为@“...”的字符串常量实际上是NSString的子类,它重新定义保留和释放为no-ops。这允许编译器将这些字符串常量存储在可执行文件的数据段中而不是堆上。
答案 1 :(得分:3)
NSString *constantString = @"constantString";
像constantString
这样的字符串被称为来自私有(?)类NSConstantString,它们在您的整个程序生命周期中都是活着的。非正式发布和保留工作(意味着他们不会给你一个例外或崩溃)他们什么都不做。
了解更多here
另外,您在其中一条评论中说,这将是{@property(..., copy) NSString myString;
但您向我们展示的是典型的@property(..., retain)
答案 2 :(得分:0)
头文件中是否声明了myString
?喜欢:@property(nonatomic, retain) NSString myString
。如果是这种情况,则保留myString
。否则,没有必要释放它。