2017-10-10 108 views
0
NSArray *array = [NSMutableArray array]; 

如果我使用这段代码分配一个数组,屏幕后面会发生什么?这是一种好时尚还是缺点?在我的项目,如果我有这样的事情:这个objective-c变量初始化时尚是否正确?

NSArray *array = [NSMutableArray array]; 
array = [array arrayByAddingObject:@"Hi"]; 
NSLog(@"%@",array); 

输出:嗨

但如果我这样做是这样的:5日线得到了触发

@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; 
} 

之后,filesInfo类型变为到NSConcreteMutableData类型。

预先感谢您!

回答

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; 
+0

是的,我知道这是非常破碎和危险。我的项目中的代码片段是由其他人编写的2011,似乎模仿Java变量声明时尚。例如:Map map = new HashMap (); –