灌装NSMutableArray的Objective-C的
问题描述:
可以请人给我解释一下下面的代码片段之间的差异来填充myStrings阵列:灌装NSMutableArray的Objective-C的
NSString *match = @"ad*.png";
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *dirContents = [fm contentsOfDirectoryAtPath:bundleRoot error:nil];
NSPredicate *fltr = [NSPredicate predicateWithFormat:@"SELF like %@", match];
NSArray *onlyPNGs = [dirContents filteredArrayUsingPredicate:fltr];
myStrings = [NSMutableArray array];
for(int i=0;i<[onlyPNGs count];i++)
{
[myStrings addObject:(NSString *)[onlyPNGs objectAtIndex:i]];
}
NSLog([myStrings description]);
当我填写我的数组这种方式,构造后,myStrings成为空莫名其妙,但而不是填充过滤器,如果我手动添加项目everythings罚款:
[myStrings addObject:@"adburgerking1.png"];
[myStrings addObject:@"adburgerking2.png"];
[myStrings addObject:@"adburgerking3.png"];
[myStrings addObject:@"addominos1.png"];
[myStrings addObject:@"admcdonalds1.png"];
[myStrings addObject:@"admcdonalds2.png"];
[myStrings addObject:@"admcdonalds3.png"];
[myStrings addObject:@"admeshuriskender1.png"];
[myStrings addObject:@"adquickchina1.png"];
[myStrings addObject:@"adsencam1.png"];
[myStrings addObject:@"adsultanahmetkoftecisi1.png"];
在此先感谢!
答
从你的第一个评论:myStrings
是retain
语义属性 - 如果作为一个属性(self.myStrings = ...
)访问的属性将只保留一个值,如果直接分配给基础变量(myStrings = ...
)不会有任何保留。
从你的第二个评论:[[NSMutableArray alloc] init]
与[NSMutableArray array]
- [[NSMutableArray alloc] init]
返回一个数组,你自己,你不要retain
它保留它;然而[NSMutableArray array]
返回一个你不拥有的数组,如果你想保留它,你必须使用retain
。
所以,你需要的是:
self.myStrings = [NSMutableArray array];
的RHS返回你没有自己的阵列中,LHS将retain
它 - 现在它会呆在身边。
你也许会使用:
myStrings = [[NSMutableArray里的alloc]初始化]。
作为RHS返回一个您拥有的数组,并且LHS只是将其存储起来没有在您访问变量而不是属性时保留它。然而,这个版本不会release
任何以前由myStrings
引用的数组,因此一般不起作用。
该规则总是使用点符号访问属性,可能例外的是类init
和dealloc
方法(最后一点是有争议的)。
出于好奇,什么样的变量是'myStrings'?它只是一个普通的伊娃,还是它的财产?如果它是一个财产,你使用ARC?如果您使用的是ARC,请确保属性类型是STRONG或COPY,否则它将被释放并且无效。 – Malaxeur 2012-04-07 07:57:41
即时通讯编程相当新,但即时通讯尝试将文件名称存储为NSString *。在头文件中: @property(nonatomic,retain)NSMutableArray * myStrings; – dramaticlook 2012-04-07 09:17:52
你可能有一个局部变量,也称为'myStrings',它隐藏了实例变量? – 2012-04-07 09:33:16