局部对象变量调用分线程方法
2014-08-07 15:19
746 查看
demo1.
}-(void)log{ NSLog(@"I am log method"); [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(printLog) userInfo:nil repeats:YES];}-(void)printLog{ NSLog(@"log");}-(void)dealloc{ NSLog(@"I am newThead delloc");}@end
上述代码打印:
2014-08-07 14:24:44.453 ARCMemoryTest[17159:3507] I am log method
2014-08-07 14:24:44.454 ARCMemoryTest[17159:3507] I am newThead delloc
由上述demo可知,局部对象,调用分线程方法,方法一遍,对象就释放了。
demo2.
再来看一下,如果局部变量调用主线程的情况:
替换上述方法,打印结果如下:
2014-08-07 14:57:54.913 ARCMemoryTest[17240:60b] I am log method
2014-08-07 14:57:55.014 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.113 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.214 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.314 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.414 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.514 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.614 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.714 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.814 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.914 ARCMemoryTest[17240:60b] log
demo3.
再来看一下如果局部变量分线程中有block块的情况:
设想:如果有对指向self的指针,调用方法的话,应该会crash,或者不调用该方法
验证:
打印结果:
2014-08-07 15:12:54.943 ARCMemoryTest[17301:3507] I am log method
2014-08-07 15:12:54.944 ARCMemoryTest[17301:3507] I am newThead delloc
block没有打印,说明,block,如果局部对象调用异步方法的话,是需要被写成成员变量的(无论其中含有什么)
补充点常识:空指针调用方法不会奔溃,但是如果指针不为空,指向的内存释放了的话,就会奔溃,这也是为什么好多人都会习惯 self.property = nil,的原因
@implementation PEKViewController -(void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor redColor]; PEKNewThread *newThread = [[PEKNewThread alloc] init]; [newThread startLog]; } @end
@implementation PEKNewThread -(void)startLog { [self performSelectorInBackground:@selector(log) withObject:nil]; // [self log];<pre name="code" class="objc">typedef void (^timeRreachBlock)(int times); @interface PEKNewThread : NSObject { int times; } -(void)startLog; @property(nonatomic,copy)timeRreachBlock reachBlock; @end
@implementation PEKNewThread -(void)startLog { [self performSelectorInBackground:@selector(log) withObject:nil]; //[self log]; } -(void)log { NSLog(@"I am log method"); times ++; if (times == 3) { if (self.reachBlock) { [self reachBlock]; } } [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(printLog) userInfo:nil repeats:YES]; } -(void)printLog { NSLog(@"log"); } -(void)dealloc { NSLog(@"I am newThead delloc"); } @end
}-(void)log{ NSLog(@"I am log method"); [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(printLog) userInfo:nil repeats:YES];}-(void)printLog{ NSLog(@"log");}-(void)dealloc{ NSLog(@"I am newThead delloc");}@end
上述代码打印:
2014-08-07 14:24:44.453 ARCMemoryTest[17159:3507] I am log method
2014-08-07 14:24:44.454 ARCMemoryTest[17159:3507] I am newThead delloc
由上述demo可知,局部对象,调用分线程方法,方法一遍,对象就释放了。
demo2.
再来看一下,如果局部变量调用主线程的情况:
-(void)startLog { // [self performSelectorInBackground:@selector(log) withObject:nil]; [self log]; }
替换上述方法,打印结果如下:
2014-08-07 14:57:54.913 ARCMemoryTest[17240:60b] I am log method
2014-08-07 14:57:55.014 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.113 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.214 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.314 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.414 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.514 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.614 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.714 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.814 ARCMemoryTest[17240:60b] log
2014-08-07 14:57:55.914 ARCMemoryTest[17240:60b] log
demo3.
再来看一下如果局部变量分线程中有block块的情况:
设想:如果有对指向self的指针,调用方法的话,应该会crash,或者不调用该方法
验证:
@implementation PEKViewController -(void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor redColor]; PEKNewThread *newThread = [[PEKNewThread alloc] init]; [newThread startLog]; newThread.reachBlock = ^(int times) { NSLog(@"I am block I am excute"); }; } @end
typedef void (^timeRreachBlock)(int times); @interface PEKNewThread : NSObject { int times; } -(void)startLog; @property(nonatomic,copy)timeRreachBlock reachBlock; @end
#import "PEKNewThread.h"
@implementation PEKNewThread -(void)startLog { [self performSelectorInBackground:@selector(log) withObject:nil]; //[self log]; } -(void)log { NSLog(@"I am log method"); times ++; if (times == 3) { if (self.reachBlock) { [self reachBlock]; } } [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(printLog) userInfo:nil repeats:YES]; } -(void)printLog { NSLog(@"log"); } -(void)dealloc { NSLog(@"I am newThead delloc"); } @end
打印结果:
2014-08-07 15:12:54.943 ARCMemoryTest[17301:3507] I am log method
2014-08-07 15:12:54.944 ARCMemoryTest[17301:3507] I am newThead delloc
block没有打印,说明,block,如果局部对象调用异步方法的话,是需要被写成成员变量的(无论其中含有什么)
补充点常识:空指针调用方法不会奔溃,但是如果指针不为空,指向的内存释放了的话,就会奔溃,这也是为什么好多人都会习惯 self.property = nil,的原因
相关文章推荐
- 用了invoke还是出错的解决方法.wpf 调用线程无法访问此对象,因为另一个线程拥有该对象。
- ruby中如何调用与局部变量同名的私有方法
- 被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法
- 学习javaSE 类和对象,方法,构造方法,成员变量与局部变量
- Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象
- 面向对象和静态方法与非静态方法的变量调用问题
- 调用线程对象的start()方法启动线程
- OC 继承子类对象调用方法机制 子类对象访问父类中的实例变量
- php部分(查看文件、建立站点、语法变量、变量的几个方法、“全局局部变量的调用”、static、函数参数的作用域);
- OC中继承子类对象调用方法机制 子类对象访问父类中的实例变量
- iOS小练习,创建对象,初始化成员变量,对象调用方法
- OC中继承子类对象调用方法机制 子类对象访问父类中的实例变量
- 带有public static void main方法的类,其中的成员变量必须是static的,否则main方法没法调用。除非是main里的局部变量。因为main方法就是static的啊。
- 上转型对象的成员变量和成员方法的调用
- ruby中如何调用与局部变量同名的私有方法
- 2015.4.28类、对象的初步学习(构建类,成员变量、方法的调用)
- 重踏学习Java路上_Day07(成员与局部变量,形参,匿名对象,封装,private,this,构造与成员方法,static)
- 调用线程对象的start()方法会执行run(),为什么不能直接调用run()方法??
- 关于多个线程同时调用单例模式的对象,该对象中方法的局部变量是否会受多个线程的影响
- 待补充:java类里的私有变量问题,在对象A里有一个对象B,调用对象B的方法获取变量,会有短暂的缓存