2015-10-18 17:36:04 myzlhh 阅读数 2123
0x00 懒加载
    ​被声明为属性的成员,在ios5之前需要使用编译器指令@synthesize告诉编译器帮助生成属性的getter,setter方法。之后会默认生成。编译器在生成getter,setter方法时先检查有没有自定义getter,setter方法,如果有则使用自定义的,没有才生成。
    懒加载就是重写属性的getter方法,然后加一个判断,为空则赋值,不为空则返回。代码如下:
  1. @interface ViewController ()

  2. @property (nonatomic, copy) NSString *mtest;

  3. @end

  4. @implementation ViewController

  5. // 懒加载

  6. -(NSString *)mtest {

  7.    if (_mtest == nil) {

  8.        _mtest = @"aaa";

  9.    }

  10.    return _mtest;

  11. }

  12. - (void)viewDidLoad {

  13.    [super viewDidLoad];

  14.    NSLog(@"%@", self.mtest);

  15. }

  16. @end

0x01 self.mtest和_mtest的区别
    ​在第一次使用时由于没注意到两者的区别,在setter方法中调用self.mtest,结果导致了setter方法的循环调用。写法如下:
  1. // 错误写法

  2. ​-(NSString *)mtest {

  3. if (self.mtest == nil) {
  4. self.mtest = @"aaa";
  5. }
  6. return self.mtest;
  7. }
    ​导致原因是,self.mtest会调用属性的setter方法,触发懒加载,但是_mtest只是访问一个局部变量。

    ​


2017-07-25 15:11:13 GYMotgm 阅读数 752

贯穿中间的横线 线的颜色与文字颜色一致

  NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@"3500"];

  [str addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlinePatternSolid | NSUnderlineStyleSingle) range:NSMakeRange(0, 5)];

  你的Label.attributedText = str;


文字添加下划线,线的颜色与文字颜色一致

  NSMutableAttributedString * str = [[NSMutableAttributedString alloc]initWithString:@"3500"];

  [str addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(0, 5)];

    你的Label.attributedText = str;



2017-02-22 15:44:03 sinat_34225684 阅读数 1628

iOS中self和下划线的区别

首先通过self.xxx 访问属性的方法包含了set和get方法。而通过下划线是获取自己的实例变量,不包含set和get的方法。
例如:
@property (nonatomic,copy) NSString *propertyName;

self.propertyName 是对属性的访问;

_propertyName 是对局部变量的访问。

@property的声明中,编译器在生成getter,setter方法时是有优先级的,它首先查找当前的类中用户是否已定义属性的getter,setter方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。 无论怎样你在使用self.propertyName 时是都在调用一个getter方法。self.propertyName 会让计数器+1;

而_propertyName,是直接调用变量,不通过getter方法。

_propertyName是类似于self->_propertyName。

所以使用self.xxx是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下滑线的时候忽略了self这个指针,后者容易在BLock中造成循环引用。另外,使用下划线是获取不到父类的属性。

最后总结:self方法实际上是用了get和set方法间接调用,下划线方法是直接对变量操作。

2016-06-04 20:51:00 weixin_30614587 阅读数 10

本文转载自iOS中self.和下划线的区别

1.通过self.xxx的访问调用了方法:包含了set和get方法。而通过下划线的访问是获取自己的实例变量,不包含set和get的方法。

2.self.xxx是对属性的访问;而_xxx是对局部变量的访问。所有被声明为属性的成员,再ios5之前需要使用编译指令@synthesize 来告诉编译器帮助生成属性的getter和setter方法,之后这个指令可以不用认为的指定了,默认情况下编译器会帮助我们生成。

译器在生成getter,setter方法时是有优先级的,他首先查找当前的类中用户是否定义属性的getter,setter方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。也就是说你在使用self.xxx时是调用一个getter方法。会使引用计数加一,而_xx

不会使用引用计数加一的。所以使用self.xxx是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下滑线的时候忽略了self这个指针,后者容易在Block中造成循环引用。同时,使用 _是获取不到父类的属性,因为它只是对局部变量的访问。

总结:self方法实际上是用了get和set方法间接调用,下划线方法是直接对变量操作。



 

转载于:https://www.cnblogs.com/soley/p/5559506.html

2016-09-12 21:43:17 u013886407 阅读数 179
#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,strong) NSMutableArray *arr1;
@property (nonatomic,strong) NSMutableArray *arr2;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.arr1 addObject:@"1"];
    NSLog(@"------ %ld",self.arr1.count);
    
    [_arr2 addObject:@"2"];
    NSLog(@"======= %ld",self.arr2.count);
    
}
-(NSMutableArray *)arr1
{
    if (_arr1 == nil) {
        _arr1 = [NSMutableArray array];
    }
    return _arr1;
}
-(NSMutableArray *)arr2
{
    if (_arr2 == nil) {
        _arr2 = [NSMutableArray array];
    }
    return _arr2;
}

@end

1.首先通过self.xxx 通过访问的方法的引用:包含了set和get方法。而通过下划线是获取自己的实例变量,不包含set和get的方法。

 2.self.xxx是对属性的访问;而_xxx是对局部变量的访问。所有被声明为属性的成员,再ios5之前需要使用编译指令@synthesize 来告诉编译器帮助生成属性的getter和setter方法,之后这个指令可以不用认为的指定了,默认情况下编译器会帮助我们生成。编译器在生成getter,setter方法时是有优先级的,他首先查找当前的类中用户是否定义属性的getter,setter方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。也就是说你在使用self.xxx时是调用一个getter方法。会使引用计数加一,而_xxx不会使用引用技术加一的。

    所有使用self.xxx是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下滑线的时候忽略了self这个指针,后者容易在BLock中造成循环引用。同时,使用 _是获取不到父类的属性,因为它只是对局部变量的访问。

最后总结:self方法实际上是用了get和set方法间接调用,下划线方法是直接对变量操作

消除iOS导航栏下划线

博文 来自: lolevergreen
没有更多推荐了,返回首页