NSObject解析

2018-04-18  本文已影响0人  being_sun

copy与mutableCopy

stringCopy会跟着string变化而变化;
NSMutableString *string = [NSMutableString   stringWithString:@"origin"];//copy
NSString*stringCopy = string ;
NSLog(@"%@",stringCopy);
[stringappendString:@"app"];
NSLog(@"%@",stringCopy);
这样写不会
NSMutableString *string = [NSMutableString stringWithString:@"origin"];//copy
NSString *stringCopy = [string copy];
NSLog(@"%@",stringCopy);
[stringappendString:@"app"];]
NSLog(@"%@",stringCopy);

@synthesize和@dynamic分别有什么作用

  1. @property有两个对应的词,一个是 @synthesize,一个是@dynamic。如果 @synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _var;

  2. @synthesize 的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法。

  3. @dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 的属性只需提供 getter 即可)

    假如一个属性被声明为@dynamic var,然后你没有提供 @setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺 setter 方法会导致程序崩溃;或者当运行到 someVar = var 时,由于缺 getter 方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动 态绑定。

  4. @synthesize 合成实例变量的规则,有以下几点:

    • 如果指定了成员变量的名称,会生成一个指定的名称的成员变量,
    • 如果这个成员已经存在了就不再生成了.
    • 如果是@synthesize name; 还会生成一个名称为name的成员变量,也就是说:
      如果没有指定成员变量的名称会自动生成一个属性同名的成员变量.
    • 但有在如情况下是不会的,会报警告:
    @interface persion ()
    @property (nonatomic, copy) NSString *_name;
    @end
    @implementation persion
    @synthesize string = _name;
    //警告:`Auto property synthesis will not synthesize property '_string' 
         because it cannot share an ivar with another synthesized property`
    

一个objc对象的isa的指针指向什么

***************************  
persion 
*************************** 
@interface persion : NSObject
@property (nonatomic, copy) NSString *name;
@end

@implementation persion
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @":";
    }
    return self;
}
@end

***************************  
chinaPersion 
*************************** 
@interface chinaPersion : persion

@end

@implementation chinaPersion
@synthesize name = _name;

- (void)setName:(NSString *)name {
    //设置方法一:如果setter采用是这种方式,就可能引起崩溃
    if (![name isEqualToString:@""])  {
      
    }
    _name = name;
    
}
@end

 chinaPersion *p2 = [[chinaPersion alloc] init];
// 这样调用,注意只是有可能崩溃

参考链接:微博@Chun_iOS的博文
根问底Objective-C Runtime(1)- Self & Super

runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)

能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么?

runloop的mode作用是什么?

model 主要是用来指定事件在运行循环中的优先级的,分为:

NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态
UITrackingRunLoopMode:ScrollView滑动时
UIInitializationRunLoopMode:启动时
NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合

苹果公开提供的 Mode 有两个:
NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
NSRunLoopCommonModes(kCFRunLoopCommonModes)

参考链接:
1. 《深入理解RunLoop》
2. 摘自博文CFRunLoop

objc使用什么机制管理对象内存?

通过 retainCount 的机制来决定对象是否需要释放。 每次 runloop 的时候,都会检查对象的 retainCount,如果retainCount 为 0,说明该对象没有地方需要继续使用了,可以释放掉了。

不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?

分两种情况:手动干预释放时机、系统自动去释放。
但是如果每次都放进应用程序的 main.m 中的 autoreleasepool 中,迟早有被撑满的一刻。这个过程中必定有一个释放的动作。何时?

BAD_ACCESS在什么情况下出现?

上一篇 下一篇

猜你喜欢

热点阅读