南山商城网站建设多少钱,wordpress默认安装目录,wordpress添加og标签,做母婴产品哪个网站做的好demo贴上我的github blockOne
块类似于匿名函数或闭包#xff0c;在许多其他编程语言中也存在类似的概念。
Block
以下是块的一些基本知识#xff1a;
块的定义#xff1a;块是由一对花括号 {} 包围的代码片段#xff0c;可以包含一段可执行的代码。块的定义使用 ^ 符号…demo贴上我的github blockOne
块类似于匿名函数或闭包在许多其他编程语言中也存在类似的概念。
Block
以下是块的一些基本知识
块的定义块是由一对花括号 {} 包围的代码片段可以包含一段可执行的代码。块的定义使用 ^ 符号并可以带有参数列表和返回类型。例如
^{// 代码块的内容
}
块的类型块也是一种数据类型与函数类似。它们可以具有参数和返回值类型。可以使用 typedef 来定义块的类型。例如
typedef returnType (^BlockTypeName)(parameterTypes);
其中 returnType 是块的返回类型BlockTypeName 是块的类型名称parameterTypes 是块的参数类型。 3. 块的赋值和调用块可以赋值给变量并且可以像函数一样进行调用。可以使用 运算符将块赋值给变量然后使用该变量调用块。例如
ReturnType (^blockName)(ParameterTypes) ^ReturnType (Parameters) {// 块的内容
};
blockName(argumentValues); // 调用块
块的捕获变量块可以捕获其定义范围内的变量并在块内部访问这些变量。捕获的变量在块中形成了一个闭包可以在块的[[生命周期]]内保持其状态。例如
NSInteger outsideVariable 10;
void (^block)(void) ^{NSLog(Outside variable: %ld, (long)outsideVariable);
};
block(); // 输出Outside variable: 10在这个例子中块捕获了外部的 outsideVariable 变量并在块内部访问它。 默认情况下为块所捕获的变量是不可以在块里面修改的如果修改了outsideVariale的值就会报错声明变量的时候可以加上__block修饰符这样就可以在块内修改了 块作为参数块可以作为方法或函数的参数进行传递从而实现回调和异步操作等功能。可以将块作为参数声明并在调用方法或函数时传递块。例如
- (void)performOperationWithCompletion:(void (^)(void))completionBlock {// 执行操作// 操作完成后调用块completionBlock();
}// 调用方法传递块作为参数
[self performOperationWithCompletion:^{NSLog(Operation completed!);
}];
在这个例子中performOperationWithCompletion: 方法接受一个块作为参数并在操作完成后调用该块。
#pragma mark **--修改为块所捕获的变量**NSArray *array [0, 1, 2, 3, 4, 5];**__block** NSInteger count 0;//块作为方法的参数[array enumerateObjectsUsingBlock:^(NSNumber *number, NSUInteger idx, **BOOL** *stop) {**if** ([number compare:2] NSOrderedAscending) {count;}NSLog(%ld%,(**unsigned** **long**)idx, number);}];NSLog(%ld, (**long**)count);//内联块的用法传给“numberateObjectsUsingBlock:方法的块并未先赋给局部变量而是直接在内联函数中调用了如果块所捕获的变量类型是对象类型的话那么就会自动保留它系统在释放这个块的时候也会将其一并释放。这就引出了一个与块有关的重要问题块本身可以视为对象在其他oc对象能响应的选择子中很多块也可以响应最重要的是块本身也会像其他对象一样有引用计数为0时块就回收了同时也会释放块所捕获的变量以便平衡捕获时所执行的保留操作//如果块定义在oc类的实例方法中那么除了可以访问类的所有实例变量之外还可以使用self变量块总能修改实例变量那么除了声明时无需添加__block。不过如果通过读取或写入操作捕获了实例变量那么也会自动把self给捕获了因为实例变量是与self所指代的实例关联在一起的。// 需要注意的是(self也是一个对象也会被保留如果在块内部使用了实例变量块会自动对self进行保留操作以确保在块执行期间保持对象的有效性。但是如果在块内部直接使用了self并对其进行读取或写入操作那么self也会被捕获从而导致循环引用的问题。为了避免循环引用可以在块内部使用__weak修饰符来避免对self进行保留操作。如果某个实例在执行anInstanceMethod放法那么self变量就会指向此实例。由于块里没有明确使用self变量所以很容易就会忘记self变量其实也为块所捕获了。直接访问实例遍历和通过self来访问时等效的 self-_anInstanceVariable “someThing”;
typedef void(^SomeBlock) (void);
property (nonatomic, copy) BlockName someBlock;
- (void)anInstanceMethod {self.someBlock ^ {_anInstanceVariable someThing;}}self也是个对象因而块在捕获它时也会将其保留。如果self所指代的那个对象同时也保留了块那么这种情况就会导致“保留环” 修改为以下代码即可
typedef void(^SomeBlock) (void);
property (nonatomic, copy) BlockName someBlock;
__weak typeof(self)weakSelf self;
- (void)anInstanceMethod {self.someBlock ^ {weakSelf.anInstanceVariable someThing;}}