面試的時候碰到有人問這個問題 這個問題實際是問的不是很嚴謹 實際是要區分arc和mrc
查閱相關資料之后 總結 也不一定對
首先要理解runloop和runloop的observer和休眠 還需要理解autoreleasepool
在autoreleasepool的源碼中 有autoreleasepoolPush操作和autoreleasepoolPop操作 并且記錄下了兩個操作之間所有的autorelease對象的地址 autoreleasepoolPop實際是就是autoreleasepool的析構方法 相當于swift中的deinit
在autoreleasepoolPop操作中 會從后往前調用所有記錄的對象的release方法
巧妙的是 runloop剛進入的時候也會調用autoreleasepoolPush操作
在休眠的時候也會調用 autoreleasepoolPop 和 autoreleasepoolPush操作 這就意味著 在runloop的兩次休眠過程中 已經完成了類似autoreleasepool的內部邏輯 期間所有的autorelease對象已經被調用release方法 也就是計數器-1 所謂的臨時變量的計數器也就為0 ====被釋放
所有這道題如果現在讓我來回答
@autoreleasepool {
NSObject *obj = [[NSObject alloc] init];
//如果被autoreleasepool包裹 那么就是在這個autoreleasepool結束的時候釋放的
}
arc實際是就是llvm編譯器+runtime llvm 編譯器會自動插入retain release代碼
如果在viewdidload的括號前 插入了[obj release]那就是出了這個方法就被釋放
如果不是的話 就是在當前runloop下一次進入休眠或者退出的時候被釋放
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *obj = [[NSObject alloc] init];
//類似于這種
}