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



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

//
//  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

因为你有一个空的二传手。

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

当你做self.textToAnalyze = something与做[self setTextToAnalyze:something]相同,所以永远不会设置实例变量。

更改自定义实现,如下所示:

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

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

@property (nonatomic) NSAttributedString *textToAnalyze;

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

最新更新