NSArray *array = [NSMutableArray array];
如果我使用这段代码分配数组,屏幕后面会发生什么?它是一种好时尚还是任何劣势?在我的项目中,如果我有这样的事情:
NSArray *array = [NSMutableArray array];
array = [array arrayByAddingObject:@"Hi"];
NSLog(@"%@",array);
输出:嗨
但如果我这样做:
@property (assign) NSArray *filesInfo;
switch (streamEvent) {
case NSStreamEventOpenCompleted: {
self.filesInfo = [NSArray array];
self.didOpenStream = YES;
self.receivedData = [NSMutableData data];
break;
}
case NSStreamEventHasBytesAvailable: {
data = [self.streamInfo read:self];
if (data) {
[self.receivedData appendData:data];
}
else {
[self.streamInfo streamError:self errorCode:kGRFTPClientCantReadStream];
}
break;
}
case NSStreamEventHasSpaceAvailable:
break;
case NSStreamEventErrorOccurred: {
[self.streamInfo streamError:self errorCode:[GRError errorCodeWithError:[theStream streamError]]];
break;
}
case NSStreamEventEndEncountered: {
NSUInteger offset = 0;
CFIndex parsedBytes;
uint8_t *bytes = (uint8_t *)[self.receivedData bytes];
NSUInteger totalbytes = [self.receivedData length];
do {
@autoreleasepool {
CFDictionaryRef listingEntity = NULL;
parsedBytes = CFFTPCreateParsedResourceListing(NULL, &bytes[offset], totalbytes - offset, &listingEntity);
if (parsedBytes > 0) {
if (listingEntity != NULL) {
self.filesInfo = [self.filesInfo arrayByAddingObject:(__bridge_transfer NSDictionary *)listingEntity];
}
offset += parsedBytes;
}
}
} while (parsedBytes > 0);
[self.streamInfo streamComplete:self];
break;
}
default:
break;
}
第5行被触发后,filesInfo类型变为NSConcreteMutableData类型。
提前谢谢!
答案 0 :(得分:2)
NSArray *array = [NSMutableArray array];
这"工作"但是没有多大意义。您已经创建了一个可变数组,但声明它是不可变的。你的意思是:
NSMutableArray *array = [NSMutableArray array];
或者你的意思是:
NSArray *array = @[]; // The same as [NSArray array]
这段代码有点奇怪,虽然它也可以工作:
NSArray *array = [NSMutableArray array];
array = [array arrayByAddingObject:@"Hi"];
NSLog(@"%@",array);
您正在创建一个可变数组,但后来将其视为不可变数组。你真的应该使用一种模式或另一种模式。使其成为不可变的(@[]
)或使用可变性:
NSMutableArray *array = [NSMutableArray array];
[array addObject:@"Hi"];
这是非常破碎和危险的:
@property (assign) NSArray *filesInfo;
在assign
处使用filesInfo
会在释放@property (strong) NSArray *filesInfo;
时创建未定义的行为(因为您没有抓住它)。考虑到你如何使用它,你不能真正打赌这个变量。你的意思是:
{{1}}