簡體   English   中英

Objective-C中的嵌套工廠方法

[英]Nested factory methods in Objective-C

用嵌套工廠方法處理內存管理的最佳方法是什么,例如下面的示例?

@interface MyClass : NSObject {
    int _arg;
}

+ (MyClass *) SpecialCase1;
+ (MyClass *) SpecialCase2;
+ (MyClass *) myClassWithArg:(int)arg;
- (id) initWithArg:(int)arg;

@property (nonatomic, assign) int arg;

@end

@implementation MyClass

@synthesize arg = _arg;

+ (MyClass *) SpecialCase1
{
    return [MyClass myClassWithArg:1];
}

+ (MyClass *) SpecialCase2
{
    return [MyClass myClassWithArg:2];
}

+ (MyClass *) myClassWithArg:(int)arg
{
    MyClass *instance = [[[MyClass alloc] initWithArg:arg] autorelease];

    return instance;
}

- (id) initWithArg:(int)arg
{
    self = [super init];
    if (nil != self) {
        self.arg = arg;
    }

    return self;
}

@end

這里的問題(我認為)是,在SpecialCaseN方法返回給其調用方之前,已刷新了自動釋放池[編輯:顯然不是-請參見下面的評論]。 因此,SpecialCaseN的最終調用者不能依賴保留的結果。 (在嘗試將[MyClass SpecialCase1]的結果分配給另一個對象的屬性時,出現“ [[MyClass copyWithZone:]:無法識別的選擇器發送到實例0x100110250”)。)

需要SpecialCaseN工廠方法的原因是,在我的實際項目中,初始化實例需要多個參數,並且我有一個預定義的“模型”實例列表,希望能夠輕松創建。

我敢肯定有比這更好的方法。

[編輯:每個請求添加@interface。]

您為什么認為自動釋放池已被刷新?

除非您刷新自動釋放池,否則將不會以可可接觸方式刷新自動釋放池,除非將其釋放或將控件返回到事件循環。

iPhone內存管理指南

Application Kit在事件周期(或事件循環迭代)的開始(例如鼠標按下事件)的開頭自動創建一個池,並在結束時釋放它,因此您的代碼通常不必擔心它們。

該錯誤准確地描述了問題:調用了copyWithZone,並且未在MyClass中實現。 檢查分配給它的屬性或屬性的實現(請參閱是否正在復制)。 另外,如果將MyClass的實例用作NSDictionary的鍵,則將調用copyWithZone。 這是有關實現copyWithZone的一些信息。

暫無
暫無

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

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