[問題] iPhoneSDK: subview release的問題

看板MacDev作者 (2A3C好聲好好聽)時間15年前 (2010/01/04 12:35), 編輯推噓1(107)
留言8則, 4人參與, 最新討論串1/1
最近在看iphoneSDK的sample code 其中有一個是水平儀的sample 裡面有個LevelView的class 在LevelView.h裡有幾個UIImageView UIImageView *bubbleView; UIImageView *upDownArrowsView; UIImageView *downUpArrowsView; 在LevelView.m裡,這些UIImageView被初始化,如: bubbleView = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"bubble.png"]]; (bubbleView retainCount = 1) 然後被加到LevelView裡 [self addSubview:bubbleView]; (bubbleView retainCount = 2) 最後在dealloc()裡,bubbleView被release [bubbleView release]; 那這時bubbleView的retainCount是1,對嗎? 那怎麼變0呢? 是在[super dealloc]時,LevelView的super class(UIView)把它清掉的嗎? 另外,有些UIImageView沒有出現在LevelView.h 而是直接在.m宣告,如: UIImageView *levelFrontView = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"levelBackground.png"]]; [self addSubview:levelFrontView]; [levelFrontView release]; 它被加到LevelView後,就把它release了 (我想也是,因為在dealloc()裡沒法release它 ) 想請教的是 剛剛前面那一個bubbleView,為什麼不在addSubview之後就release它 而要等到dealloc才release呢? 這兩者間有什麼差別? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.120.62

01/04 12:57, , 1F
會不會是bubbleView其他地方還要用到,所以就先不release?
01/04 12:57, 1F

01/04 18:07, , 2F
因為你等一下還要去改變泡泡(bubbleView)的位置丫。
01/04 18:07, 2F

01/04 19:29, , 3F
那再請問被addSubview產生的retaincount是由誰release?
01/04 19:29, 3F

01/04 22:29, , 4F
因為你addSubView了,當self在解構時,會把所有的child view
01/04 22:29, 4F

01/04 22:29, , 5F
都release掉。
01/04 22:29, 5F

01/04 22:30, , 6F
跟NSArray是一樣的道理,NSArray解構時會把他持有的NSObject
01/04 22:30, 6F

01/04 22:30, , 7F
,都呼叫release,然後retain count就會-1
01/04 22:30, 7F

01/04 23:18, , 8F
懂了 感謝
01/04 23:18, 8F
文章代碼(AID): #1BGN0BHg (MacDev)
文章代碼(AID): #1BGN0BHg (MacDev)