property&Ivar

默认的情况下。property = Ivar + getter + setter
get set只能重写一个。重写两个要@synthesize nameString = _nameString;
MRC下重写set
-(void)setName:(NSString *)name
{
  if (_name != name)
  {
   [_name release];
   [name retain];
_name = name;
}
}
property属性:
1.readonly
如果您不希望通过setter方法更改属性,您可以向属性声明中添加一个属性来指定它应该是只读的。在这种情况下。readonly告诉编译器只生成getter方法。不会生成setter方法。但是可以用KVC和Ivar进行赋值操作。
属性默认是readwrite

  1. atomic
    属性默认为atomic。atomic比较慢。
    即使从不同线程同时调用访问器,合成的访问器也要确保值总是由getter方法完全检索或通过setter方法完全设置。(说人话。可以得到完整的value和完整的set value)
    因为原子访问器方法的内部实现和同步是私有的,所以不可能将合成的访问器与您自己实现的访问器方法组合在一起。例如,如果您尝试为原子的readwrite属性提供自定义setter,但让编译器合成getter,那么您将得到编译器警告。
  2. nonatomic
    您可以使用非原子属性属性来指定合成的访问器直接设置或返回一个值,而不必保证从不同线程同时访问相同的值会发生什么。因此,访问非原子属性要比访问原子属性快得多,并且可以将合成的setter和自己的getter实现结合起来:
    4.weak & strong
__weak  TestObj * weakObj = [NSObject new];
block = ^(){
    __strong  TestObj *strongObj = weakObj;
        if(! strongObj) return;
    NSLog(@"TestObj对象地址:%@",strongObj);
    dispatch_async(dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
        
        for (int i = 0; i < 1000000; i++) {
            // 模拟一个耗时的任务
        }

        NSLog(@"耗时的任务 结束 TestObj对象地址:%@",strongObj);
    });

关于weak的实现。https://github.com/BiBoyang/Study/wiki/@property的研究(二)-weak关键字.
5.copy
但是NSMutableString用strong修饰。

@interface XYZBadgeView : NSView
@property NSString *firstName;
@property NSString *lastName;
@end
 NSMutableString *nameString = [NSMutableString stringWithString:@"John"];
 self.badgeView.firstName = nameString;
[nameString appendString:@"ny"];
  1. unsafe_unretained
    ARC下用__unsafe_unretained 替代__weak
    有些不能被weak修饰的类比如:
    NSATSTypesetter, NSColorSpace, NSFont, NSMenuView, NSParagraphStyle, NSSimpleHorizontalTypesetter, and NSTextView.

使用alloc创建对象;Runtime负责释放对象
您不能显式调用dealloc,或实现或调用retain、release、retainCount或autorelease。
如果需要管理实例变量以外的资源,可以实现dealloc方法。您不必(实际上您不能)释放实例变量,但是您可能需要调用[systemClassInstance setDelegate:nil]上的系统类和其他没有使用ARC编译的代码。
ARC中的自定义dealloc方法不需要调用[super dealloc]
不能为访问器提供以new开头的名称。这又意味着,例如,除非指定了不同的getter,否则不能声明名称以new开头的属性:

// Won't work:
@property NSString *newTitle;
// Works:
@property (getter=theNewTitle) NSString *newTitle;

__strong是默认值。只要有一个指向对象的强指针,对象就保持“活着”。
__weak指定了一个引用,它不能保持被引用对象的生命。当对象没有强引用时,弱引用被设置为nil。
__unsafe_unretain指定一个引用,该引用不保存被引用的对象,当对象没有强引用时不设为nil。如果它引用的对象被释放,指针就会保持悬空状态。
__autoreleasing用于表示通过引用(id *)传递的参数,并在返回时自动递增。

两种block解决循环引用的方式。

MyViewController *myController = [[MyViewController alloc] init…];
// ...
MyViewController * __weak weakMyViewController = myController;
myController.completionHandler =  ^(NSInteger result) {
    [weakMyViewController dismissViewControllerAnimated:YES completion:nil];
};
MyViewController * __block myController = [[MyViewController alloc] init…];
// ...
myController.completionHandler =  ^(NSInteger result) {
    [myController dismissViewControllerAnimated:YES completion:nil];
    myController = nil;
};
MyViewController *myController = [[MyViewController alloc] init…];
// ...
MyViewController * __weak weakMyController = myController;
myController.completionHandler =  ^(NSInteger result) {
    MyViewController *strongMyController = weakMyController;
    if (strongMyController) {
        // ...
        [strongMyController dismissViewControllerAnimated:YES completion:nil];
        // ...
    }
    else {
        // Probably nothing...
    }
};

__bridge_transfer或CFBridgingRelease将一个非Objective-C指针移动到Objective-C,并将所有权转移到ARC。

__autoreleasing

  • (BOOL)save:(NSError **)error;
    其实,这个(NSError **)error相当于(NSError * __autoreleasing *)error,编译器默认为其生成了__autoreleasing修饰符。

编译器默认生成__autoreleasing修饰符的做法,也是在贯彻内存管理原则,即确保只有通过以alloc/new/copy/mutableCopy开头的方法返回的对象才能被持有。

虽然当我们自己定义id *obj类型的参数时,也可以显式指定它的所有权修饰符为其他,并通过编译,但为了贯彻内存管理原则,还是应该将id *obj类型的参数的所有权修饰符指定为__autoreleasing。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容