![](/img/trans.png)
[英]differing methods of alloc / init / retaining an object in objective-c
[英]when to use self.property in init methods in objective-c, how to initialize arrays in init methods
我對於在內存管理,自定義子類和數組方面為自己的子類編寫自定義init方法的正確方法感到困惑。 如果我有以下屬性:
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableArray *array;
@property (nonatomic, retain) SomeSubclassOfNSObject *object;
@interface SomeSubclassofNSObject
@property (nonatomic, retain) NSString *category;
如何編寫我的初始化方法?
你會做:
initWithName:(NSString *)aName object:(SomeSubclassOfNSObject *)anObject {
if (self = [super init]) {
self.name = aName; // or do you do name = aName or name = [aName copy] autorelease] or name = [NSString alloc] initWithFormat:@"%@", aName]
self.object = anObject; // do I need to make a copy of this object so they don't point to the same object?
// loop through NSMutableArray and copy the objects?
// not really sure what to do for arrays.
}
return self;
}
我會推薦self.name = aName;
在大多數情況下,因為這會利用生成的setter的優勢,因此保留計數會隱式增加。 這意味着無論init
的調用者隨后使用aName
做什么,您的引用都是安全的。 對於dealloc對應對象也是如此:只需寫成self.name = nil;
和你完成。
如果您提供NSMutableString
情況會有所不同,因為類內部的更改將影響其他類對此的引用。 但是從設計的角度來看,僅當您希望操縱可變字符串時,才應將可變字符串用作參數。
self.object = anObject;
:嗯,這取決於您想要什么。 如果所有類都應指向同一個對象,則不要進行復制(我認為這通常正是您想要的)。 在某些情況下,進行深復制是合理的。
數組:您需要類似array = [[NSMutableArray alloc] init];
在您的init方法中。 之后,對於您添加的每個對象,保留計數將自動增加,即您不得在添加的對象本身上調用保留。 像在2中一樣。在某些情況下,您可能確實希望擁有某個源數組的對象的副本。 可以,但是很少有這種情況。
通常,您有一個現有的數組,並且想要它的子數組或特殊排序的版本。 因此,您有了一個新數組,但元素相同。
這是簡短的答案。 有關更多信息,請參見:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.