当像这样使用时(即通过直接访问实例变量),不,它不会。但是,如果您使用属性的访问器方法([self setS:nil];
或self.s = nil;
),那么是的,它会的。
另请注意,释放对象和释放其内存是两件完全不同的事情。一个对象只有在它没有更多的强引用时才会被释放 - 即你有对它的最后一个引用然后你释放它。如果你释放它但它有其他引用(之前被保留),那么它不会被释放,只有它的引用计数会减一。
此外,如果您有一个保留的属性,例如您的示例中的那个,您不能这样做 1. 直接访问底层实例变量,2. 做类似的事情
NSString *m = [NSString stringWithString:@"Hellow, World"];
s = [m retain];
为什么?因为第一行根本没有必要——真的,为什么- [NSString stringWithString:]
?您正在创建一个常量字符串,然后创建它的精确副本 - 这只是多余的。如果 Cocoa 的设计者是菜鸟,那么这行代码也会浪费内存——同一不可变字符串的两个完全相同的副本。幸运的是,实现 NSString 的人已经为这种情况做好了准备,并让这个方法检查它的参数是否是一个常量,如果是,则不做任何事情就返回它 - 所以你会返回相同的指针,但需要额外调用objc_msgSend
- 这不是什么你要。
第二行也是错误的 - 同样,您没有按原样使用支持 ivar。此外,声明该属性是retain
有原因的 - 如果您将一个对象设置为您的属性,该对象将由 setter 方法保留 - 无需手动保留它。
总而言之,你最好写
self.s = @"Hello World";
// ...
self.s = nil;
反而。