2010-09-18 15 views
0
@interface{ 
    NSArray *array; 
} 
@property (nonatomic, retain) NSArray *array; 
@end 

@implementation 
@synthesize array; 
    self.array = [[NSArray alloc] init]; 
    array = [[NSArray alloc] init]; 

[self.array objectAtIndex:2]; [array objectAtIndex:2]; 
@end 

它們之間有區別嗎?爲什麼我應該使用一個呢?爲什麼或爲什麼不用「自我」來稱呼對象。字首?

+0

可能重複[何時使用類屬性上的自我?](http://stackoverflow.com/questions/867001/when-to-use-self-on-class-properties) – Chuck 2010-09-18 20:53:19

回答

4

self.array = foo[self setArray:foo](即您訪問綜合屬性方法)的簡寫,而只是array = foo直接訪問實例變量。

在這種情況下,您將創建一個self.array = [[NSArray alloc] init];內存泄漏,因爲該屬性將保留它並且引用計數因此將是2而不是1.因此更好的是:self.array = [NSArray array];

哪一個更喜歡幾乎是品味的問題,但使用屬性給你一些優勢,如自動鍵值編碼支持。如果你有一天選擇自己實現setArray:,這也是一個優勢,因此當數組被分配時(如重新加載UITableView),它可以做更多的事情。另一方面,它會慢一點,因爲它是一個額外的方法調用(如果在循環中調用很多)。但對於幾乎所有的應用來說,最好是儘可能快地修正。使用屬性可以使內存管理更容易。

3

屬性「數組」被聲明爲在賦值時保留(@property表示此後的括號中的保留)。因爲它具有與「數組」實例變量相同的名稱,所以它使用該實例變量作爲後備存儲。

有效地調用self.array = [[NSArray alloc] init];是與調用array = [[[NSArray alloc] init] retain];

當您直接分配給實例變量,而不是使用屬性,不採取任何行動就可以了,所以陣列僅指向的NSArray的新實例,不保留它。

+0

作爲上述的必然結果,'self.array = [[NSArray alloc] init]'很可能(事實上,幾乎可以肯定)泄漏;因爲你已經擁有了你正在創建的對象('NSArray'),然後你的財產正在保留它,導致你擁有它兩次。 – jer 2010-09-18 20:51:01

+0

如何訪問數據時,[self.array objectAtIndex:2] vs [array objectAtIndex:2] – ssj 2010-09-18 20:58:01

相關問題