ios - 这个 objective-c 变量初始化方式是否正确?

标签 ios objective-c

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 类型。

提前致谢!

最佳答案

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"];

这是非常 splinter 和危险的:

@property (assign) NSArray *filesInfo;

在这里使用 assign 会在 filesInfo 被释放时创建未定义的行为(因为您没有保留它)。考虑到您如何使用它,您不能真的对这个变量下任何赌注。你的意思是:

@property (strong) NSArray *filesInfo;

关于ios - 这个 objective-c 变量初始化方式是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46656754/

相关文章:

ios - 如何手动将下一个信号发送到 RxSwift 中的可观察对象?

ios - Apache Usergrid Swift SDK 访问 Assets 图像

ios - 如何加快亚马逊云前端的图像加载速度

objective-c - 基于 View 的 NSTableView 的扩展

ios - 如何仅在纵向中设置方向?

objective-c - 在 NSMutableArray 中观察计数

ios - 在 IOS 应用程序中使用 FFMPEG 的可靠性?

iphone - 访问上次收到的已关闭/忽略的推送通知

ios - NSMutableAttributedString:如何在 iOS 上以编程方式删除最后一个字符?

ios - 创建临时 CoreData 实体(在非持久性 MagicalRecord 上下文中)?