NSString * str =[[NSString alloc] initWithString:@"this is from initWithString function"];
NSLog(@"this is from [[NSString alloc] initWithString] m_addr is %ld retainCount is %i", str, [str retainCount]);
[str release];
[str release];
[str release];
NSLog(@"this is from [[NSString alloc] initWithString] m_addr is %ld retainCount is %i", str, [str retainCount]);
str = [[NSString alloc] initWithFormat:@"this is from initWithFormat function"];
NSLog(@"this is from [[NSString alloc] initWithFormat] m_addr is %ld retainCount is %d", str, [str retainCount]);
retainCount
Returns the receiver’s reference count. (required)
Return Value
The receiver’s reference count.
Discussion
You might override this method in a class to implement your own reference-counting scheme. For objects that never get released (that is, their release
UINT_MAX
, as defined in <limits.h>
.
小生窃以为,此处的UINT_MAX和NSIntegerMax是一样的,都是表示所在类型的最大值。所以,initWithString这个方法初始化后的对象是不可能被release的或者说,它的release方法啥也不干。
验证了上面的分析2.因为他不可能被release的或者说,它的release方法啥也不干,所以我们调用无数次release都没有起到预先想想的作用。
为什么会导致这样的情况呢?
我们再次把目光转向地址。眼尖的同学可能会看到initWithString申请的地址每次都是一样的,而initWithFormat的地址每次都不一样,这个说明什么?
说明initWithString的地址是静态的,而initWithFormat是动态的。为什么前者是静态的,而后者是动态的?
结合上面关于retainCount的分析,小生窃以为initWithString的地址申请是在编译是进行的,这样才能说明为什么它的地址空间如此靠前。只有在编译是进行的,他才是静态的。
对于initWithString生成的对象,对其进行dealloc时,程序会报错(这里就不贴LOG了)。而后者initWithFormat不会报错。这进一步验证了initWithString生成的是静态对象,而initWithFormat是动态的。
结论:initWithString生成的对象是在编译是申请地址空间,而且在程序中不能释放,不建议使用。