2017-10-10 112 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 (); –