【问题标题】:Problem with UITableView DelegateUITableView 委托的问题
【发布时间】:2011-07-14 17:30:40
【问题描述】:

我正在合成几个字符串:

.h

@property(nonatomic,copy) NSString* bio;

.m

@synthesize       bio;

//connectionDidFinish method
bio = [[[profile objectForKey:@"user"] valueForKey:@"profile"] valueForKey:@"bio"];

当我的 tableview 首次加载时,我在 cellForRowAtIndexPath 中收到错误 -[NSNull length]: unrecognized selector sent to instance 0x11d45e8

case kBioSectionDescriptionRow:                 
                    if ([bio length]==0 ||bio == nil) {
                        cell.textLabel.text = @"bio";   
                        cell.selectionStyle = UITableViewCellSelectionStyleNone;
                        cell.detailTextLabel.numberOfLines = 5;
                        cell.detailTextLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:(14.0)];
                        cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
                        cell.detailTextLabel.text = @"None"; 
                    }
                    else{
                        cell.textLabel.text = @"bio";   
                        cell.selectionStyle = UITableViewCellSelectionStyleNone;
                        cell.detailTextLabel.numberOfLines = 5;
                        cell.detailTextLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:(14.0)];
                        cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
                        cell.detailTextLabel.text = [NSString stringWithFormat: @"%@", bio]; 
                    }

                    break;

如何确保我的简历已分配且不为空?

【问题讨论】:

    标签: iphone objective-c cocoa-touch uitableview nsstring


    【解决方案1】:

    如果你@synthesize你的bio属性,为什么你使用变量而不是属性?

    您需要影响属性本身,而不是直接影响变量bio = [[[profile objectForKey:@"user"] valueForKey:@"profile"] valueForKey:@"bio"];self.bio = [[[profile objectForKey:@"user"] valueForKey:@"profile"] valueForKey:@"bio"];


    更准确地说,写self.bio = xx意味着它调用了bio属性的setter方法。该 setter 将为您管理内存,这意味着它将释放 bio 属性的先前值并复制新值。

    如果你写bio = xx,直接影响实例变量而不是属性,不释放或复制,所以你影响到bio变量的对象不保留也不复制并将在当前 RunLoop 结束时销毁。

    这就是您的代码崩溃的原因,因为您随后尝试访问 bio 变量,该变量不再指向任何东西(实际上它指向垃圾,在您的情况下……它错误地认为是[NSNull null] 对象)因为真正的对象已经被销毁了!


    实际上,@synthesize bio 只是要求编译器为属性的 setter 和 getter 生成代码,并且由于您的属性是使用 nonatomic,copy 属性定义的,因此生成的 setter 将如下所示:

    -(void)setBio:(NSString*)value {
      if (value == bio) return; // if already the exact same object (same pointer), return
    
      [self willChangeValueForKey:@"bio"]; // For KVO
      [bio release]; // release previous value
      bio = [value copy]; // copy new value
      [self didChangeValueForKey:@"bio"]; // For KVO
    }
    

    注意:不要忘记在 dealloc 方法中释放 bio 变量(或将 self.bio 属性设置为 nil)以避免内存泄漏

    【讨论】:

      【解决方案2】:

      您在 -connectionDidFinish 中对 bio 的分配应该是对 self.bio 的分配。

      【讨论】:

        猜你喜欢
        • 2016-07-27
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        相关资源
        最近更新 更多