2011-07-14 138 views
0

我有我合成一對夫婦的字符串:問題的UITableView的委託

.H

@property(nonatomic,copy) NSString* bio; 

.M

@synthesize  bio; 

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

當我的tableview首次加載我得到一個錯誤-[NSNull length]: unrecognized selector sent to instance 0x11d45e8 in cellForRowAtIndexPath:

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; 

我怎樣才能確保我的生物分配而不是空?

回答

3

如果你@synthesize你的bio屬性,爲什麼你使用變量而不是屬性?

不是直接影響變量bio = [[[profile objectForKey:@"user"] valueForKey:@"profile"] valueForKey:@"bio"];,而是需要改爲影響屬性本身:self.bio = [[[profile objectForKey:@"user"] valueForKey:@"profile"] valueForKey:@"bio"];


更確切地說,寫self.bio = xx意味着它調用的生物屬性的setter方法。這名負責人將爲您管理記憶,這意味着它將釋放生物財產的先前價值並複製新的價值。

如果你寫bio = xx代替,從而直接影響到實例變量而不是財產,沒有發佈或複製完成,所以你會影響到生物變量的客體是不保留,也不復制並會在被銷燬當前RunLoop的結尾。

這就是爲什麼你的代碼崩潰,因爲你再嘗試訪問bio變量,它沒有指向任何東西了(實際上它指向垃圾,你的情況來STHG它誤認爲是[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方法(或到self.bio屬性設置爲nil),以避免泄漏內存

0

您的任務轉給bio in -connectionDidFinish應該賦值給self.bio。