有人可以解释一下填写myStrings数组的以下代码片段之间的区别:
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以某种方式变为null,而不是填充过滤器,如果我手动添加项目,那么很好:
[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"];
提前致谢!!!
答案 0 :(得分:3)
从您的第一条评论开始: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] init];
当RHS返回您拥有的数组时,LHS只会将存储在中,而不会保留它,因为您正在访问变量而不是属性。但是,此版本不会release
myStrings
引用的任何先前数组,因此通常不起作用。
规则始终使用点表示法访问属性,可能除了类init
和dealloc
方法之外(最后一点是有争议的)。