【问题标题】:Incompatible pointer types assigning to 'NSString *' from 'NSMutableArray *'从'NSMutableArray *'分配给'NSString *'的不兼容指针类型
【发布时间】:2015-02-04 13:02:57
【问题描述】:

我目前正在学习 iOS 开发课程,我在课程中遇到的这行代码会生成以下警告:Incompatible pointer types assignmenting to 'NSString *' from 'NSMutableArray *'。

media.comments = randomComments;

数组是在这一行创建的:

NSMutableArray *randomComments = [NSMutableArray array];

按照本网站其他地方的建议,我尝试将 mutableCopy 添加到 randomComments 数组的末尾以使警告静音,但警告仍然存在:

// Doesn't silence warning    
NSMutableArray *randomComments = [[NSMutableArray array]mutableCopy];

有没有人有其他建议如何消除我遇到的不兼容的指针类型警告?

这里是完整的方法:

- (void) addRandomData {
    NSMutableArray *randomMediaItems = [NSMutableArray array];

    for (int i = 1; i <= 10; i++) {
        NSString *imageName = [NSString stringWithFormat:@"%d.jpg", i];
        UIImage *image = [UIImage imageNamed:imageName];

        if (image) {
            BLCMedia *media = [[BLCMedia alloc] init];
            media.user = [self randomUser];
            media.image = image;

            NSUInteger commentCount = arc4random_uniform(10);
            NSMutableArray *randomComments = [NSMutableArray array];

            for (int i  = 0; i <= commentCount; i++) {
                BLCComment *randomComment = [self randomComment];
                [randomComments addObject:randomComment];
            }

            media.comments = randomComments;

            [randomMediaItems addObject:media];
        }
    }

    self.mediaItems = randomMediaItems;
}

【问题讨论】:

  • 你需要花一些时间学习一些 Objective-C 书籍或 Apples 文档。只是抄袭,写不懂的代码不是成功之道。
  • @Zaph 实际上,做到这一点通常是理解之路的第一步。就像孩子形成他们不理解的声音是说话的开始一样,通过复制代码“通过动作”是开始理解它的好方法。
  • @AdrianB 那么你不能给它分配NSMutableArray。这是错误的对象类型。
  • BLCMedia类中commentsmedia.comments)的类型从NSString更改为NSMutableArray
  • @saif 这可能是也可能不是一个好的解决方案。如果media.comments假定NSString,则将其更改为NSMutableArray 将导致其他问题。

标签: ios objective-c pointers nsmutablearray xcode6


【解决方案1】:

您的基本问题是尝试将一种对象类型 (NSMutableArray) 分配给不同的对象类型 (NSString)。您需要确定哪个是正确的类型并使两个对象都具有该类型。

假设您正在创建一个对象数组 (BLCMedia),其中每个对象都有一个 comments 属性,类型为 NSString,以下应该可以解决您的问题:

- (void) addRandomData {
    NSMutableArray *randomMediaItems       = [NSMutableArray array];
    for (int i = 1; i < 11; i = i + 1) {
        NSString *imageName                = [NSString stringWithFormat:@"%d.jpg", i];
        UIImage *image                     = [UIImage imageNamed:imageName];
        if (image != nil) {
            BLCMedia *media                = [[BLCMedia alloc] init];
            media.user                     = [self randomUser];
            media.image                    = image;
            NSUInteger commentCount        = arc4random_uniform(10);
            for (int i = 0; i < commentCount; i = i + 1) {
                BLCComment *randomComment  = [self randomComment];
                media.comments             = randomComment;
            }
            [randomMediaItems addObject:media];
        }
    }
    self.mediaItems = randomMediaItems;
}

但是,如果BLCMedia 对象打算将NSString 对象数组作为其comments 属性,则以下方法可以解决您的问题:

// In BLCMedia.h/.m
// Change this:
@property (copy  , nonatomic) NSString       *randomComments;
// To this:
@property (strong, nonatomic) NSMutableArray *randomComments;


- (void) addRandomData {
    NSMutableArray *randomMediaItems           = [NSMutableArray array];
    for (int i = 1; i < 11; i = i + 1) {
        NSString *imageName                    = [NSString stringWithFormat:@"%d.jpg", i];
        UIImage *image                         = [UIImage imageNamed:imageName];
        if (image != nil) {
            BLCMedia *media                    = [[BLCMedia alloc] init];
            media.user                         = [self randomUser];
            media.image                        = image;
            NSUInteger commentCount            = arc4random_uniform(10);
            NSMutableArray *randomComments     = [NSMutableArray array];
            for (int i = 0; i <= commentCount; i = i + 1) {
                BLCComment *randomComment      = [self randomComment];
                [randomComments addObject:randomComment];
            }
            media.comments = randomComments;
            [randomMediaItems addObject:media];
        }
    }
    self.mediaItems = randomMediaItems;
}

【讨论】:

  • 感谢您对此的帮助!这平息了警告,我理解为什么它首先不起作用背后的机制。
  • 我从中学到的教训是跟随对它们的根的引用,在这种情况下,它超出了我正在使用的直接类。当我有能力时,我会向前支付。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多