这会导致在它的 init 方法中分配的字符串发生内存泄漏吗?由于该字符串未被引用且未被自动释放。
对,就是这样。你似乎明白了。
如果我不在 init 方法中分配一个字符串,那么当我在分配 anotherString 之前调用 ait.string 会发生什么?
您的意思是在以下情况下您不确定 unknownObject 指的是什么?:-
It *ait = [[It allow] init];
NSString *unknownObject = ait.string;
这是无稽之谈。您是否忘记添加访问器方法?
Objective-c 不使用“点语法”来访问实例变量,例如 Java。如果你有你的类'it'的一个实例,你只能通过调用访问器'getter'方法从该实例外部访问'string'变量。这不是可选的 self.string 只是方法调用 [self string] 的快捷方式,并且您显示的代码中不存在此方法。
假设访问器方法是在其他地方定义的,那么您称为 string 的实例变量(这是世界上最糟糕的变量名称)等于nil。在 Objective-c 中,您必须非常小心地处理 nil 对象,因为其行为不同于许多其他语言处理类似的null。
在 Objective-c 中这很好:
NSString *nilString = nil;
[nilString writeToFile:@"/this_file_cannot_exist.data"];
许多其他语言会在这里崩溃或抛出异常;这可能很危险,因为操作可能会失败,但您的应用程序将继续运行。它也可能很棒,因为在其他语言中你会看到很多这样的..
someObject = controller.currentValue()
if( someObject!=null )
someObject.writeToFile("myFile.data")
在 Objective-c 中根本不需要 'if(..)' 行。
您必须注意不要在 init 和 dealloc 方法中调用访问器方法,因为这可能会破坏子类。代替
- (void)dealloc {
[self.string release]; // This is [[self string] release]
...
你应该只使用
- (void)dealloc {
[string release];
...
除了危险之外,对 [self string] 的调用也是不必要的。在您的 init 方法中也是如此
if(self=[super init]){
self.string = [[NSString alloc]init]; // shortcut for [self setString:[[NSString alloc] init]]
...
只需使用
if(self=[super init]){
string = [[NSString alloc] init];
...