簡體   English   中英

何時在Objective-C的初始化方法中使用self.property,如何在初始化方法中初始化數組

[英]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;
}
  1. 我會推薦self.name = aName; 在大多數情況下,因為這會利用生成的setter的優勢,因此保留計數會隱式增加。 這意味着無論init的調用者隨后使用aName做什么,您的引用都是安全的。 對於dealloc對應對象也是如此:只需寫成self.name = nil; 和你完成。

    如果您提供NSMutableString情況會有所不同,因為類內部的更改將影響其他類對此的引用。 但是從設計的角度來看,僅當您希望操縱可變字符串時,才應將可變字符串用作參數。

  2. self.object = anObject; :嗯,這取決於您想要什么。 如果所有類都應指向同一個對象,則不要進行復制(我認為這通常正是您想要的)。 在某些情況下,進行深復制是合理的。

  3. 數組:您需要類似array = [[NSMutableArray alloc] init]; 在您的init方法中。 之后,對於您添加的每個對象,保留計數將自動增加,即您不得在添加的對象本身上調用保留。 像在2中一樣。在某些情況下,您可能確實希望擁有某個源數組的對象的副本。 可以,但是很少有這種情況。

    通常,您有一個現有的數組,並且想要它的子數組或特殊排序的版本。 因此,您有了一個新數組,但元素相同。

這是簡短的答案。 有關更多信息,請參見:

高級內存管理編程指南

申報物業

暫無
暫無

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

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