iOS Block全面分析

摘要:
http://my.oschina.net/leejan97/blog/268536http://blog.csdn.net/enuola/article/details/8674063注释1.内联块中内部定义的变量具有自己的读写权限2.要修改块中的外部变量,需要声明外部变量__Block3.Blockretain无效。要保留块的生命周期,可以复制它,

http://my.oschina.net/leejan97/blog/268536

http://blog.csdn.net/enuola/article/details/8674063

注意事项
1.内联的block中内部定义的变量 自己本身有读写权限
 
2.block内部要修改外部变量 需要将外部变量声明__block
 
3.Block retain是无效的,要想保留block生命周期,可以通过copy来实现,记得release
 
4.被block的应用的对象,retainCount会自动加一,为了打破这种 retain circle,可以在对象前加__block,这样block块就不会维护这个对象了
 
下面的写法如果不加上_block a无法dealloc
 
__block A  a =[ [[A alloc] init] withBlock:^{
 
 [a action];
 
 [ a release];
 
}]; //这样A的dealloc方法就会调用
@interface ViewController : UIViewViewController 
 {
        NSString *_string;
 }
 
 __block ViewController *controller = self;   
    _block = ^{
         NSLog(@"string %@",controller->_string);
    };
5.在独立的block中不能引用self,如果需要访问可以使用参数传递的方法(可以把其考虑成c+中参数传入函数指针对应copy)**
 
6.不要随便用.语法
 
#import <UIKit/UIKit.h>   
@interface AppDelegate : NSObject <UIApplicationDelegate>
@property (nonatomic, strong) NSString *stringProperty;  
@end
#import "GCDAppDelegate.h" 
@implementation AppDelegate 
@synthesize stringProperty;  
- (void) BlockTestError{
HelloBlock myBlock= ^(void){
self.stringProperty = @"Block Objects"; 
NSLog(@"String property = %@", self.stringProperty);//运行错误
};
myBlock();
}}  
 
- (void) BlockTestCorrect{
HelloBlock myBlock= ^(void){
[self setStringProperty:@"Block Objects"];
   NSLog(@"self.stringProperty = %@", [self stringProperty]); //运行ok
};
myBlock();
}}  
@end
 

免责声明:文章转载自《iOS Block全面分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IOS-网络(监听网络状态)lua 代码加密方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)

一.RAC 全局等待事件说明 在RAC环境中,和全局调整缓存相关的最常见的等待事件是global cache cr request,global cache busy和equeue。 当一个进程访问需要一个或者多个块时,Oracle会首先检查自己的Cache是否存在该块,如果发现没有,就会先通过global cache赋予这些块共享访问的权限,然后再访问...

magento添加调用block的几种方法

静态块主要是指在后台添加的可用静态块调用方法常见的有如下几种:(这边就不介绍使用widgets 调用的方法了,有兴趣的朋友可以自己在后台widgets中尝试设置)1、直接在HomePage中调用(只限首页):修改layout中的xml代码<reference name=”content”><block type=”cms/block”...

C# 以GZip解压缩

以GZip解压缩,这个在某次解析某站数据的时候用到了,保存留念 public static string GZipDecompressString(this string zippedString) { if (string.IsNullOrEmpty(zippedString) || zippedS...

ORACLE rowid切分大表

通过如下sql获取rowid切分范围 SELECT rownum || ', ' || ' rowid between ' || chr(39) || dbms_rowid.rowid_create(1, DOI, lo_fno, lo_block, 0) || chr(39) || ' and ' || chr(39) ||...

最全的iOS面试题及答案-转载

1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原...

iOS开发之Block

1、定义 (1) Block是OC中的一种数据类型,在iOS开发中被广泛使用 (2) ^是Block的特有标记 (3) Block的实现代码包含在{}之间 (4) 大多情况下,以内联inline函数的方式被定义和使用 (5) Block与C语言的函数指针有些相似,但使用起来更加灵活 例如: void(^demoBlock)() = ^ {     NSLo...