sách gpt4 ăn đã đi

Giải thích chi tiết về việc chuyển giá trị khối iOS (đóng)

In lại Tác giả: qq735679552 Thời gian cập nhật: 27-09-2022 22:32:09 26 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết trên blog CFSDN về chuyển giá trị khối iOS (đóng) giải thích chi tiết được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.

Trong quá trình phát triển ứng dụng iOS, chúng tôi sẽ sử dụng nhiều nơi cần truyền giá trị và có nhiều cách khác nhau để truyền giá trị: truyền giá trị proxy, truyền giá trị thông báo, KVC, KVO, block, singleton, v.v. Trong số đó, khối chắc chắn là sự lựa chọn tốt nhất để các chuyên gia truyền giá trị vì mã ngắn gọn, thực tế và chuẩn hóa. Tuy nhiên, thực sự sẽ hơi khó hiểu và sử dụng nó lúc đầu. Tôi sẽ giới thiệu chi tiết về khối. dưới.

Đầu tiên mình tóm tắt công thức khối:

  1. Bước 1. Kiểu giá trị trả về của khai báo khối (^tên khối) (danh sách tham số);
  2. Bước 2. Block thực hiện tên của khối = ^(parameter list)(){};
  3. Bước 3. chặn cuộc gọi block name();

Dưới đây là một khối đơn giản.

?
1
2
3
4
5
6
7
8
9
10
// tuyên bố
   void(^blockName)(int num,NSString *string);
// hoàn thành
   blockName = ^(int num,NSString *string)
   {
     NSLog (@ "%d,%@" ,số,chuỗi);
   };
// gọi
   blockName(520,@ "Phyone_" );
}

Từ ví dụ này, chúng ta có thể thấy rằng thứ tự thực thi mã của khối khác với thứ tự thực thi mã khác. Nó thực thi mã khai báo trước, sau đó là mã gọi và cuối cùng là mã triển khai. Do đó, chúng tôi sử dụng tính chất gọi lại của khối. để đạt được hiệu ứng truyền giá trị của chúng tôi Tất nhiên, đây chỉ là một đoạn mã trên một trang chỉ cho thấy rằng nó có chức năng truyền giá trị. Bây giờ hãy thử truyền giá trị ngược giữa nhiều trang. , chúng tôi tạo hai ViewControllers. (ViewController, Next_ViewController) Đầu tiên hãy chuyển từ ViewController sang Next_ViewController và chuyển giá trị bên trong cho ViewController. Sau đây là mã.

Bên trong ViewController.m.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- ( vô hiệu )viewDidLoad {
   [siêu viewDidLoad];
   self.view.backgroundColor = [UIColor màu tím];
  UILabel *lable = [[UILabel phân bổ]initWithFrame:CGRectMake(100, 200, 200, 100)];
   lable.backgroundColor = [UIColor brownColor];
   [self.view thêmSubview: nhãn];
   
   UITapGestureRecognizer *tap = [[UITapGestureRecognizer phân bổ]initWithTarget:self hành động:@selector(tap)];
   [self.view addGestureRecognizer:tap];
}
- ( vô hiệu )vỗ nhẹ
{
   Next_ViewController *NVC = [[Next_ViewController phân bổ]init];
   NVC.block = ^(NSString *nội dung){
     NSLog (@ "%@" ,nội dung);
     UIButton *button = [[UIButton phân bổ]initWithFrame:CGRectMake(100, 200, 100, 100)];
     [button setTitle:nội dung choState:UIControlStateNormal];
     button.backgroundColor = [UIColor orangeColor];
     [self.view thêmSubview:button];
   };
   [self presentViewController:NVC hoạt hình:CÓ hoàn thành:nil];
}

Bên trong Next_ViewController.h.

?
1
2
//khối được cấp phát trên ngăn xếp bằng cách sử dụng bản sao
@property(nonatomic,copy) vô hiệu (^block)(NSString *nội dung);

Bên trong Next_ViewController.m.

?
1
2
3
4

"lề trên: 0px; lề dưới: 0px; họ phông chữ: Menlo;" > "cỡ chữ: 12px;" >{

"lề trên: 0px; lề dưới: 0px; họ phông chữ: Menlo;" > "cỡ chữ: 12px;" vô hiệu (^imageNameBlock_1)(NSString *imageName);

"lề trên: 0px; lề dưới: 0px; họ phông chữ: Menlo;" > "cỡ chữ: 12px;" vô hiệu (^lableBlock)(NSString *tontentText);

"lề trên: 0px; lề dưới: 0px; họ phông chữ: Menlo;" > "cỡ chữ: 12px;" >}

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- ( vô hiệu )viewDidLoad {
   [siêu viewDidLoad];
   self.view.backgroundColor = [UIColor orangeColor];
   UIButton *button = [Nút UIButtonVớiLoại:UIButtonTypeTùy chỉnh];
   nút.frame = CGRectMake(100, 200, 100, 50);
   [nút đặtTiêu đề:@ "123456" forState:UIControlStateNormal];
   button.backgroundColor = [UIColor màu đỏ];
   [nút thêm mục tiêu:tự hành động:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
   [self.view thêmSubview:button];
}
- ( vô hiệu )buttonAction:(UIButton *)người gửi
{
// Nhấn nút để quay lại trang trước và chuyển giá trị này về trang trước thông qua khối
   self.block(người gửi.nhãn tiêu đề.văn bản);
   [self discardViewControllerAnimated:nil hoàn thành:nil];
}

Ngoài ra: có hai vấn đề với khối.

1. Cách thay đổi giá trị trong khối.

Sử dụng mã ở trên để thêm mã vào ViewController.m viewDidLoad.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1. Biến cục bộ
  Xác định một khối tên hình ảnh
  */
// biến cục bộ
   
   vô hiệu (^imageNameBlock)(NSString *imageName);
// Nếu bạn muốn sửa đổi giá trị trong Block thì cần thêm sửa đổi __block
   
// __block UIImage *hình ảnh;
   imageNameBlock = ^(NSString *imageName)
   {
     hình ảnh = [UIImage imageNamed:imageName];
     self.view.backgroundColor = [UIColor colorWithPatternImage:image];
   };
   Tên hình ảnhKhối(@ "17.jpg" );

Lỗi Sử dụng 'hình ảnh' định danh không được khai báo sẽ xuất hiện. Lý do là chúng tôi đang cố gắng thay đổi giá trị trong khối. Giải pháp là thêm sửa đổi __block (annotation.

__block UIImage *image;) sẽ làm được.

2. Chặn tham chiếu vòng tròn.

Sử dụng mã ở trên để thêm mã vào ViewController.m viewDidLoad.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// biến toàn cục
// Để giải tham chiếu vòng khối, chúng ta sử dụng tham chiếu yếu __block
   __weak ViewController *VC = tự;
   
   __block UIImage *image = nil;
   imageNameBlock_1 = ^(NSString *imageName)
   {
     hình ảnh = [UIImage imageNamed:imageName];
     VC.view.backgroundColor = [UIColor colorWithPatternImage:image];
   };
   UILabel *lable = [[UILabel phân bổ]initWithFrame:CGRectMake(100, 200, 200, 100)];
   lable.backgroundColor = [UIColor brownColor];
   [self.view thêmSubview: nhãn];
   
   UITapGestureRecognizer *tap = [[UITapGestureRecognizer phân bổ]initWithTarget:self hành động:@selector(tap)];
   [self.view addGestureRecognizer:tap];

Thêm hai phương pháp nữa.

?
1
2
3
4
5
6
7
8
9
- ( vô hiệu )tảiDữliệu
{
   imageNameBlock_1(@ "17.jpg" );
}
 
- ( vô hiệu )viewWillAppear:( BOOL )hoạt hình
{
   [tự tải dữ liệu];
}

Khi xảy ra tham chiếu vòng tròn, chúng tôi sử dụng __weak để sửa đổi nhưng cơ chế cụ thể vẫn chưa rõ ràng. Mong các chuyên gia có thể cho tôi một số lời khuyên. Cảm ơn mọi người đã ủng hộ.

Cuối cùng, bài viết này về giải thích chi tiết về chuyển giá trị khối iOS (đóng) kết thúc ở đây. Nếu bạn muốn biết thêm về giải thích chi tiết về chuyển giá trị khối iOS (đóng), vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng tất cả các bạn sẽ ủng hộ blog của tôi trong tương lai! .

26 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress