簡體   English   中英

for循環內的強類對象未保留在ARC中

[英]Strong Class Objects inside for loop is not retaining in ARC

我有一個“手動引用計數”項目,其中幾個類通過刪除保留,釋放等並通過設置編譯器標志“ -fobjc-arc”將Im轉換為ARC,它們是2個啟用了ARC(-fobjc-arc)的視圖控制器類,即ClassA和B類。

我正在for循環內的ClassA內分配和初始化ClassB的對象,以實現某些功能,代碼段如下所示,

@interface ClassA ()

@property (strong, nonatomic) ClassB *classBObj;

@end


@implementation ClassA

- (void)createClassBView {
    for (int count = 0; count <= [dataObject count]; count++) //if count is more than 1 it is not retaining the previous classBObj
    {
        classBObj = [[ClassB alloc] init]; //ARC is keeping only 1 object reference of this class but I need to retain all the iterated objects
        [self.scrollView addSubView:classBObj withFrame:myFrame];//only 1 view is getting added as subview even if control comes here more than once
    }
}

@end

上面的代碼對我來說在非ARC(MRC)中工作正常,但是在啟用ARC時無法正常工作。 即使它很強,它也不會保留ClassB對象,

只有1個對象,即; 最后一個迭代的ClassB對象引用仍然存在,其余對象被破壞,並且拋出異常“ ClassB引用到已釋放實例的實例”

我通過在循環中使用if(!classBObj){classBObj = [[ClassB alloc] init];}嘗試,那一次我沒有得到ClassB引用到已釋放實例異常,但是只有1個ClassB子視圖被添加到我的滾動視圖中(即最后一次迭代)。

請指導我。 任何幫助都需要提前感謝。

您的代碼完全按照您的要求執行。 您正在循環中一遍又一遍地將相同的引用self.classBObj設置為ClassB實例。 每次循環時,需要為先前分配了self.classBObj的現有ClassB實例“擺脫self.classBObj ”,以便可以將新實例分配給self.classBObj 因此,當它被新的替換時,它是正確發布的-是正確的,因為現在沒有對它的引用。

事實是,您在ARC之前完全錯失了這里的內存,而采用ARC已經揭示了這一事實。 您只是很幸運,您的代碼曾經奏效(或似乎可以奏效)。 如果要維護多個ClassB實例,則需要實例變量是它們的數組 ,而不是單個

(另一方面,如果classBObj是UIView並要作為子視圖立即添加到接口中,那么這種情況仍在發生,因此很難看到您的抱怨是什么。確實,怪異的部分是為什么您需要classBObj首先要成為一個屬性;為什么它不只是局部變量呢?這並不像您需要將這些引用保留在別處,因為您擁有這些引用—作為self.scrollView子視圖。引用供以后使用,如果您不想通過使用它們是滾動視圖的子視圖這一事實來獲取它們,那么顯然,您需要它們的數組,正如我剛才所說的。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM