iOS Block 알림, 원클릭 스킨케어 기능
모델 클래스를 먼저 정의합니다. 전체 코드
#import "BlockManager.h"
헤더 파일 정의 부분을 익히겠습니다.#import
typedef void (^CallBlock)(NSString * string);
@interface BlockManager : NSObject
@property (nonatomic,strong) NSString * userName;
@property (nonatomic,copy) CallBlock block;
@property (nonatomic,strong) NSMutableArray * blockArray;
- (void)mutiBlockWith:(CallBlock)call;
@end
#import "BlockManager.m"
클래스에서의 실현 코드#import "BlockManager.h"
@implementation BlockManager
- (void)mutiBlockWith:(CallBlock)call{
self.block = [call copy];
[self.blockArray addObject:self.block];
}
- (void)setUserName:(NSString *)userName{
for (CallBlock block in self.blockArray) {
if (block) {
block(userName);
}
}
}
- (instancetype)init
{
self = [super init];
if (self) {
self.blockArray = [NSMutableArray array];
}
return self;
}
@end
block: 우리는 패키지 함수, 익명 함수, 코드 블록이라고 부른다.block, 내가 비교적 즐겨 쓰는 리셋 함수, 왜냐하면 그는 이미 충분하기 때문이다
typedef void (^CallBlock)(NSString * string);
사용자 정의 블록 typedef-> 사용자 정의 내용void-> 블록 반환값(^CallBclok)-> 블록 이름은 우리의 방법명에 해당합니다. 사실 실제 호출은 이사 지침에 따라 호출됩니다. ^->하나의 Block 메소드 표시(NSString * string): 인삼과 같습니다. 여기에 여러 개의 매개 변수를 쓸 수 있는 매개 변수를 썼습니다.@property (nonatomic,copy) CallBlock block;
.일반적으로 ARC 메커니즘에서 Block은 copy@property (nonatomic,strong) NSMutableArray * blockArray;
를 정의했는데 왜 수조를 정의합니까? 여기에 어떤 작용이 있습니까?우리는copy의 작용이 새로운 대상을 복제하여 새로운 메모리 주소로 들어가는 것을 알고 인용 계수가 증가할 수 있음을 알고 있다. 우리copy는 사실 코드 블록이다. 우리는 모든 코드 블록에 하나의 표준 공간을 주고 우리는 그룹으로 모든 Block 블록을 저장하여 우리가 호출할 때 모두 호출할 수 있도록 한다.토론: 이거 대리님이랑 비슷하지 않아요?
[self respondsToSelector:@selector()]
에이전트는 일반적으로 응답 함수를 사용하는데 사실은 밑바닥 원리와 마찬가지로 대응하는 함수 바늘을 찾고 우리가 호출하는 것은 함수 바늘이다.만약에 우리가 대응하는 지침을 호출했다면 대응하는 방법이나 Block은 반드시 호출될 것이다. 일부 학생들은 Block이 리셋을 받지 못할 수도 있다. 사실은 대응하는 이사 지침이 호출을 받지 못했다. 모두가 아무리 공부를 해도 원리를 알아야 문제를 해결하는 사고방식이 매우 빠르다.- (void)mutiBlockWith:(CallBlock)call;
우리는 Block이 있는 구성원 방법을 정의했다. 우리는 이 방법을 여러 번 사용했는데 그 내부는 다음과 같다. - (void)mutiBlockWith:(CallBlock)call{
self.block = [call copy];
[self.blockArray addObject:self.block];
}
여기에서 우리는 수조를 통해 우리가 호출한 모든 Block을 수조에 넣었다. 틀림없이 위의 것은 이미 알고 있을 것이다
- (void)setUserName:(NSString *)userName{
for (CallBlock block in self.blockArray) {
if (block) {
block(userName);
}
}
}
속성의 setter 방법을 사용하여 Block을 호출한다고 가정한 다음 다음을 살펴보겠습니다.
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
BlockManager * block = [[BlockManager alloc]init];
[block mutiBlockWith:^(NSString *string) {
NSLog(@"111");
}];
[block mutiBlockWith:^(NSString *string) {
NSLog(@"22");
}];
[block mutiBlockWith:^(NSString *string) {
NSLog(@"33");
}];
block.userName = @"lala";
}
사실 사용은 매우 간단하다. 단지 Block은 사실 우리가 통지한 것처럼 전체 프로젝트에서 호출될 수 있다는 것을 알려줄 뿐이다.콘솔 인쇄 결과는 다음과 같습니다.
2016-03-07 22:23:34.299 BlockTest[57023:2003321] 111
2016-03-07 22:23:34.302 BlockTest[57023:2003321] 22
2016-03-07 22:23:34.304 BlockTest[57023:2003321] 33
만약 우리가 코드를 수정한다면:
BlockManager * block = [[BlockManager alloc]init];
block.userName = @"lala";
[block mutiBlockWith:^(NSString *string) {
NSLog(@"111");
}];
[block mutiBlockWith:^(NSString *string) {
NSLog(@"22");
}];
[block mutiBlockWith:^(NSString *string) {
NSLog(@"33");
}];
우리가 본 것은 속성을 위에 올려놓고 다시 실행하는 것입니다. 컨트롤러에 출력이 없습니다.
질문: 왜 Block 내부의 출력을 받지 못합니까?
세심한 프로그램 원숭이는 당신의 호출 블록이 속성을 설정한setter 방법 내부에서 호출된 것을 발견할 수 있습니다. 코드가 실행될 때 컴파일 순서에 따라 실행되었기 때문에 당시의 블록은 메모리에 복사되지 않았기 때문에 이 때 블록 블록을 호출하지 않았습니다. 이 문제는 자신의 블록이 왜 실행되지 않았는지 알 수 있을 것입니다.
오늘 이 조작은 여기까지 하겠습니다. 다음에 다중도 업로드에 대한 질문을 하겠습니다. 어떻게 라인을 사용자 정의하여 우리의 다중도 업로드 사고방식을 실현합니까?
주: 문장이 만약 잘못된 점이 있다면 더욱 잘 이해하기 위해 바로잡아 주시기 바랍니다.여기에 임시로 작은 토론방을 만들었습니다. QQ:375940898도 업무 중의 문제를 함께 토론할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.