使用self.propertyname而不是_propertyname设置时,为什么我的属性为nil

时间:2014-01-02 17:54:23

标签: ios objective-c properties

在下面的viewDidLoad()中,使用self.textToAnalyze设置我的属性会导致调试器中propertynil,而使用_textToAnalyze直接设置属性表明该物业不再是零。这是为什么?

//
//  TextStatsViewController.m
//  colorSwitcher

#import "TextStatsViewController.h"

@interface TextStatsViewController ()
@property (weak, nonatomic) IBOutlet UILabel *colorfulCharactersLabel;
@property (weak, nonatomic) IBOutlet UILabel *outlinedCharactersLabel;

@end

@implementation TextStatsViewController

-(void)setTextToAnalyze:(NSAttributedString *)textToAnalyze
{

}
-(void)viewDidLoad
{
    _textToAnalyze=[[NSAttributedString alloc] initWithString:@"test" attributes:@{NSForegroundColorAttributeName : [UIColor greenColor],NSStrokeWidthAttributeName :@-3}]; //setting it here with the underscore shows that this property is not nil in the debugger
  //self.textToAnalyze=[[NSAttributedString alloc] initWithString:@"test" attributes:@{NSForegroundColorAttributeName : [UIColor greenColor],NSStrokeWidthAttributeName :@-3}];  //setting it here with the accessor shows that this property is nil in the debugger
}

-(void)updateUI
{
    self.colorfulCharactersLabel.text =[NSString stringWithFormat:@"%d colorful characters",[[self charactersWithAttribute:NSForegroundColorAttributeName] length]];

    self.outlinedCharactersLabel.text =[NSString stringWithFormat:@"%d outlined characters",[[self charactersWithAttribute:NSStrokeWidthAttributeName] length]];
}
-(NSAttributedString *)charactersWithAttribute:(NSString *)attributeName
{
    int index=0;
    NSMutableAttributedString* characters=[[NSMutableAttributedString alloc] init];
    while(index < [self.textToAnalyze length])
    {
        NSRange range;
        id value = [self.textToAnalyze attribute:attributeName atIndex:index effectiveRange:&range];
        if(value)
        {
            [characters appendAttributedString:[self.textToAnalyze attributedSubstringFromRange:range]];
            index=range.location+range.length;
        }else{
            index++;
        }
    }
    return characters;
}

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self updateUI];
}
@end


//
//  TextStatsViewController.h
//  colorSwitcher


#import <UIKit/UIKit.h>

@interface TextStatsViewController : UIViewController
@property (nonatomic,strong)NSAttributedString* textToAnalyze;
@end

1 个答案:

答案 0 :(得分:7)

因为你有一个空的setter。

-(void)setTextToAnalyze:(NSAttributedString *)textToAnalyze
{

}

当你执行self.textToAnalyze = something与执行[self setTextToAnalyze:something]时相同,因此永远不会设置实例变量。

更改您的自定义实现:

-(void)setTextToAnalyze:(NSAttributedString *)textToAnalyze
{
    _textToAnalyze = textToAnalyze;
}

或者只是删除它,假设您已在.h文件中声明textToAnalyze为@property:

@property (nonatomic) NSAttributedString *textToAnalyze;

(此外,如果您希望保留传递的值,则属性必须很强)