弱引用指向的对象释放,测试打印有疑问

SealedBook SealedBook 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位好,我初学iOS,遇到的问题是这样:新建一个工程,使用自动垃圾回收,之后我声明了一个类,该类中的实例可以引用自己。代码如下:

#import <Foundation/Foundation.h>

@interface BNRItem : NSObject
{
int valueInDollars;
BNRItem *containedItem;
__weak BNRItem *container;
}
- (void) setContainedItem:(BNRItem*)value;
- (void) setContainer:(BNRItem*)value;
- (BNRItem*) container;

在main.m中的测试代码如下:

#import <Foundation/Foundation.h>
#import "BNRItem.h"

int main(int argc, const char * argv[])
{
@autoreleasepool {
BNRItem *bnr1 = [[BNRItem alloc] initWithItemName:@"bnr1" serialNumber:@"bnr100" valueInDollars:100];
BNRItem *bnr2 = [[BNRItem alloc] initWithItemName:@"bnr2" serialNumber:@"bnr200" valueInDollars:200];
[bnr1 setContainedItem:bnr2];
[bnr2 setContainer:bnr1];
//第一个NSLog
NSLog(@"Container:%@",[bnr2 container]);
bnr1 = nil;
//第二个NSLog
NSLog(@"Container:%@",[bnr2 container]);
}
return 0;
}


各位,我的问题来了,如果我在main.m的代码里把第一个NSLog注释掉,程序会和书上的结果一样,也就是说只输出一个null。
但是如果第一个NSLog不注释掉,那么会连续输出两个BNRItem对象。并且指针地址相同(<BNRItem: 0x10010bdb0> )。

我想问,这种情况是跟自动回收有关吗?NSLog会影响内存?如果可以我希望听到您的解答或者直接将相关资料贴上来也可以。在这我先谢谢您!
...全文

相关推荐

评论 2
收藏 已收藏
分享
返回顶部
SealedBook
iOS 29,038 成员 12,459 内容