Ios 此objective-c变量是否正确?

Ios 此objective-c变量是否正确?,ios,objective-c,Ios,Objective C,如果我使用这段代码分配数组,屏幕后面会发生什么?这是一种好的时尚还是有缺点?在我的项目中,如果我有这样的东西: NSArray *array = [NSMutableArray array]; 输出:Hi 但如果我这样做: NSArray *array = [NSMutableArray array]; array = [array arrayByAddingObject:@"Hi"]; NSLog(@"%@",array); 触发第5行后,fileinfo类型变为nsConcreteMem

如果我使用这段代码分配数组,屏幕后面会发生什么?这是一种好的时尚还是有缺点?在我的项目中,如果我有这样的东西:

NSArray *array = [NSMutableArray array];
输出:Hi

但如果我这样做:

NSArray *array = [NSMutableArray array];
array = [array arrayByAddingObject:@"Hi"];
NSLog(@"%@",array);
触发第5行后,fileinfo类型变为nsConcreteMemTableData类型

提前谢谢你

@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;
}
这“有效”,但没有多大意义。您创建了一个可变数组,但声明它是不可变的。你的意思是:

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"];
使用
assign
在释放
fileinfo
时创建未定义的行为(因为您没有抓住它)。考虑到你是如何使用这个变量的,你不能对它下任何赌注。你的意思是:

@property (assign) NSArray *filesInfo;
这“有效”,但没有多大意义。您创建了一个可变数组,但声明它是不可变的。你的意思是:

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"];
使用
assign
在释放
fileinfo
时创建未定义的行为(因为您没有抓住它)。考虑到你是如何使用这个变量的,你不能对它下任何赌注。你的意思是:

@property (assign) NSArray *filesInfo;

是的,我知道它很破很危险。我的项目中的代码片段是2011年由其他人编写的,它似乎模仿了Java变量声明方式。类似于:Map Map=newhashmap();是的,我知道它很破很危险。我的项目中的代码片段是2011年由其他人编写的,它似乎模仿了Java变量声明方式。类似于:Map Map=newhashmap();