Iphone 分配ivar

Iphone 分配ivar,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,为什么我不能简单: self.list = [[NSArray alloc] initWithObjects: @"Who Hash", @"Bubba Gump Shrimp Étouffée", @"Who Pudding", @"Scooby Snacks", @"Everlasting Gobstopper", @"Green Eggs and Ham", @"Soylent Green", @"Hard Tack", @"Lembas Bread", @"Roast Beast",

为什么我不能简单:

self.list = [[NSArray alloc] initWithObjects: @"Who Hash", @"Bubba Gump Shrimp Étouffée", @"Who Pudding", @"Scooby Snacks", @"Everlasting Gobstopper", @"Green Eggs and Ham", @"Soylent Green", @"Hard Tack", @"Lembas Bread", @"Roast Beast", @"Blancmange", nil];
而不是:

NSArray *array = [[NSArray alloc] initWithObjects:@"Who Hash", @"Bubba Gump Shrimp Étouffée", @"Who Pudding", @"Scooby Snacks", @"Everlasting Gobstopper", @"Green Eggs and Ham", @"Soylent Green", @"Hard Tack", @"Lembas Bread", @"Roast Beast", @"Blancmange", nil];
self.list = array;

事实上你可以。但是,如果列表属性声明为retain,则必须这样做:

self.list = [[[NSArray alloc] initWithObjects: @"Who Hash", @"Bubba Gump Shrimp Étouffée", @"Who Pudding", @"Scooby Snacks", @"Everlasting Gobstopper", @"Green Eggs and Ham", @"Soylent Green", @"Hard Tack", @"Lembas Bread", @"Roast Beast", @"Blancmange", nil] autorelease];
甚至更短:

self.list =  [NSArray arrayWithObjects: "Who Hash", @"Bubba Gump Shrimp Étouffée", @"Who Pudding", @"Scooby Snacks", @"Everlasting Gobstopper", @"Green Eggs and Ham", @"Soylent Green", @"Hard Tack", @"Lembas Bread", @"Roast Beast", @"Blancmange", nil];

否则你会泄漏的。

事实上你可以。但是,如果列表属性声明为retain,则必须这样做:

self.list = [[[NSArray alloc] initWithObjects: @"Who Hash", @"Bubba Gump Shrimp Étouffée", @"Who Pudding", @"Scooby Snacks", @"Everlasting Gobstopper", @"Green Eggs and Ham", @"Soylent Green", @"Hard Tack", @"Lembas Bread", @"Roast Beast", @"Blancmange", nil] autorelease];
甚至更短:

self.list =  [NSArray arrayWithObjects: "Who Hash", @"Bubba Gump Shrimp Étouffée", @"Who Pudding", @"Scooby Snacks", @"Everlasting Gobstopper", @"Green Eggs and Ham", @"Soylent Green", @"Hard Tack", @"Lembas Bread", @"Roast Beast", @"Blancmange", nil];

否则,您将得到泄漏。

您发布的两种方法都在泄漏

假设
list
声明为如下属性

@property (nonatomic, retain) NSArray *list;
self.list = [[[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil] autorelease];
然后我们知道,当通过合成setter设置列表时,使用
self.list=xxx
,它将被保留,保留计数为1。另外,通过调用alloc/init,retain会再次增加到2。话虽如此,我们可以用内存安全的方式重写你的两种方法,就像这样

@property (nonatomic, retain) NSArray *list;
self.list = [[[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil] autorelease];

self.list=[NSArray数组,其对象为:@“A”、“B”、“C”、“nil]


您发布的两种方法都在泄漏

假设
list
声明为如下属性

@property (nonatomic, retain) NSArray *list;
self.list = [[[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil] autorelease];
然后我们知道,当通过合成setter设置列表时,使用
self.list=xxx
,它将被保留,保留计数为1。另外,通过调用alloc/init,retain会再次增加到2。话虽如此,我们可以用内存安全的方式重写你的两种方法,就像这样

@property (nonatomic, retain) NSArray *list;
self.list = [[[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil] autorelease];

self.list=[NSArray数组,其对象为:@“A”、“B”、“C”、“nil]


你可以,为什么你认为你不能?你可以,为什么你认为你不能?只是吹毛求疵--由于alloc/init,retain计数将为1,由于retain属性,retain计数将为2。你倒着说的,我知道。我只是按照从左到右的顺序进行阅读。只是吹毛求疵——由于alloc/init,retain计数为1,由于retain属性,retain计数为2。你倒着说的,我知道。我只是想让你从左到右阅读。