XCode跨多台计算机的结果不一致

时间:2011-10-17 00:54:39

标签: iphone objective-c ios xcode cocoa-touch

因此,项目组成员和我一直在分别处理我们的部件。我一直在处理应用程序中的一半视图,他已经在另一半工作。我把他的一半送到了他的一半,但当他试图打开我的一半并运行它时,我们得到了不一致的结果。我们还没有合并它们,所以它们不应该采取不同的行动。我试图在其他几台计算机上测试它们,它们都给出了相同的结果(与我的不同)。

以下代码应该打印“CHECKED X”。 X表示在该点滴答的单元格数。在我的计算机上,它打印“CHECKED 1..2..3..4”,您最多只能选择4,具体取决于勾选的数量。在任何其他计算机上,它打印“CHECKED 0”,您可以选择任意多个(但你不能取消它们)。勾选它们的代码在这里:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

        UITableViewCell *cell = [tableView cellForRowAtIndexPath: indexPath];
        [tableView deselectRowAtIndexPath:indexPath animated:YES];

        if ((cell.accessoryType == UITableViewCellAccessoryNone) && [[DataContainerSingleton theDataContainerSingleton].favourites count] < 4 && ![self.tickedIndexPaths containsObject:indexPath])
        {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
                [self.tickedIndexPaths addObject:indexPath];

                [[DataContainerSingleton theDataContainerSingleton].favourites addObject:[drinks objectAtIndex:indexPath.row]]; // DOES NOT ADD AN OBJECT?
                NSLog(@"CHECKED %d", [[DataContainerSingleton theDataContainerSingleton].favourites count]);
        }
        else if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
        {
            [self.tickedIndexPaths removeObject:indexPath];
            for (int i = 0; i < [[DataContainerSingleton theDataContainerSingleton].favourites count]; i++)
            {
                NSString *drinkName = [[drinks objectAtIndex:indexPath.row] name];
                NSString *favName = [[[DataContainerSingleton theDataContainerSingleton].favourites objectAtIndex:i] name];

                if ([drinkName isEqualToString: favName])
                {
                    cell.accessoryType = UITableViewCellAccessoryNone;
                    [[DataContainerSingleton theDataContainerSingleton].favourites removeObjectAtIndex:i];
                    NSLog(@"UNCHECKED %d", [[DataContainerSingleton theDataContainerSingleton].favourites count]);
                }
            }

        }

}

在我看来,我的数据容器单例中的收藏夹数组没有被填充。饮料阵列不是空的。

以下是DataContainerSingleton类的代码:

DataContainerSingleton.h

#import <Foundation/Foundation.h>


@interface DataContainerSingleton : NSObject 
{
    NSMutableArray *favourites;
    NSMutableArray *drinks;
    NSString *name;
    int caffeine;

    @private

}

@property (nonatomic, retain) NSMutableArray *favourites;
@property (nonatomic, retain) NSMutableArray *drinks;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) int caffeine;

+ (DataContainerSingleton *) theDataContainerSingleton;
@end

DataContainerSingleton.m

#import "DataContainerSingleton.h"


@implementation DataContainerSingleton

@synthesize favourites, drinks;
@synthesize name, caffeine;

static DataContainerSingleton* _theDataContainerSingleton = nil;

+ (DataContainerSingleton*) theDataContainerSingleton;
{
    if (!_theDataContainerSingleton)
        _theDataContainerSingleton = [[DataContainerSingleton alloc] init];
    return _theDataContainerSingleton;
}

- (id)init
{
    self = [super init];
    if (self) 
    {
        self.favourites = [[[NSMutableArray alloc] init] autorelease];
    }

    return self;
}

- (void)dealloc
{
    [super dealloc];
}

@end

我检查了程序中的所有依赖项,它们都不在我复制的文件夹之外。我已经清理并清理了构建文件夹,但它仍然打印0。

有人知道可能导致这种不一致的原因吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

  

我把他的一半送给他,以结合他的一半

开始使用版本控制软件。你正在为自己制造不必要的事情。起初有一个小的学习曲线,但即使你的第一个非平凡的项目也会得到回报。

如果您确定您拥有相同的代码库副本,那么您可以将其缩小为以下之一:

  • 不同的工具链。确保您使用相同版本的所有SDK等运行相同版本的Xcode。

  • 不同的数据。从您的设备中删除该应用,然后重试。

  • 在捆绑包中存档文件。通过Xcode安装开发版本不会从捆绑包中删除旧文件。你的包中可能有他没有的文件,反之亦然。从您的设备中删除该应用,然后重试。

  • 不同的硬件。偶尔错误只会出现在某些硬件上。不同的设备功能可以在不同的路径上发送相同的代码。你们两个都试着暂时在模拟器中进行测试。

答案 1 :(得分:0)

我认为您提到的“不一致结果”可能是因为您可能已在Interface Builder中为delegate的{​​{1}}和dataSource建立了连接tableView,但您的朋友有DataContainerSingleton的不同版本,其中不存在该连接。这不会给出任何编译错误或警告,但会将其自身表示为“错误”,其中没有实际调用任何委托或数据源方法。既然您可以看到日志记录语句,我会假设.xib设置正确,但delegate不是..?

另一个选项是您的dataSource方法每次都返回一个新单元格(没有复选标记,因此您只能检查但永远不会取消选中)。

编辑:为了更准确地说明这一点,你应该在cellForRowAtIndexPath中有这些代码:

cellForRowAtIndexPath

否则,如果iPhone的内存不足,操作系统会要求应用程序从内存中清除任何非必需的对象,其中包括现有的单元格。因此,下次您在第2行检索单元格时,它必须创建一个具有默认值的新UITableViewCell *cell; cell = [tableView dequeueReusableCellWithIdentifier:@"drinkCell"]; if(cell == nil) // we need to create a new one { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"drinkCell"]; } if([tickedIndexPaths containsObject:indexPath]) { cell.accessoryType = UITableViewCellAccessoryCheckmark; } else { cell.accessoryType = UITableViewCellAccessoryNone; } 对象,这意味着UITableViewCell的附件。因此,每次获取单元格时都应明确设置复选标记。

看到你的第一条评论后:好的。您应确保不添加重复的None。如果选择了某行,请确保indexPath不包含您要添加的路径。