iOS中數(shù)據(jù)傳值的幾種方式

值傳遞:基本數(shù)據(jù)類型的變量之間的數(shù)據(jù)傳遞

//值傳遞不會(huì)改變變量的值
void func(int a)
{
   a = 4;
}
int main(int argc, const char * argv[]) {
  int a = 8 ;
  func(a);
  printf("%d",a);//答案為8
  return 0;
}
``` 

## 指針類型之間的地址傳遞

```objc
//地址傳遞會(huì)改變變量的值
void func(int *a){
  *a = 4;
}
int main(int argc, const char * argv[]) {
   int a = 8 ;
   func(&a);
   printf("%d",a);//答案為4
   return 0;
}

全局變量static和extern

1)static修飾的全局變量作用范圍為定義變量的文件,變量存儲(chǔ)在靜態(tài)區(qū),生命周期與程序生命一致;
    2)extern只能聲明變量,使作用范圍擴(kuò)大到整個(gè)程序文件,生命周期與程序生命一致;

代理設(shè)置模式的數(shù)據(jù)傳值

代理模式是為了解決程序的低耦合,高內(nèi)聚而產(chǎn)生,比如:
    1)A對(duì)象做不了的事情,B對(duì)象來幫A做;
    2)B對(duì)象想監(jiān)聽A對(duì)象的行為;
    3)當(dāng)A發(fā)生一些事情, 想通知B對(duì)象的時(shí)候

//A設(shè)計(jì)協(xié)議
@protocol testViewDelegate
@optional
-(void)outPut:(NSString *)theTitle;
@end
//B遵守協(xié)議...
//B實(shí)現(xiàn)協(xié)議方法...

通過系統(tǒng)通知傳值

//先發(fā)布通知
/* 
name:通知名稱 
object:誰發(fā)出通知 
nil代表匿名發(fā)布 */
[[NSNotificationCenter defaultCenter] postNotificationName:@"note" object:nil];
//監(jiān)聽通知
//方式一:
/*
 Observer:誰觀察通知 
selector:監(jiān)聽到通知,就會(huì)調(diào)用這個(gè)方法 
name:通知名稱 
object:誰發(fā)出通知nil代表監(jiān)聽所有 */
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reciveNote) name:@"note" object:nil];
//方式二:
/* name:通知名稱 
object:誰發(fā)出通知 
queue: 確定Block在哪個(gè)線程調(diào)用 隊(duì)列,傳入nil,block就會(huì)直接運(yùn)行在發(fā)布通知線程中 
usingBlock:只要監(jiān)聽到通知,就會(huì)自動(dòng)調(diào)用這個(gè)block */ 
_observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"note" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
     NSLog(@"%@",self); NSLog(@"%@",[NSThread currentThread]); 
     NSLog(@"調(diào)用了block:監(jiān)聽到通知"); }];
//方式三
//userInfo表示傳入的數(shù)據(jù)
[[NSNotificationCenter defaultCenter] postNotificationName:@"note" object:nil userInfo:nil];

通過的block傳遞(此項(xiàng)重點(diǎn)頗多)

  • Block聲明
// 聲明:返回值(^block變量名)(參數(shù))void(^block)();//(無返回值無參數(shù))
  • Block定義
// 定義
// 方式一:
void(^block1)() = ^(){NSLog(@"調(diào)用block1");};
// 調(diào)用Block,就會(huì)去查看下Block保存代碼block1();
// 方式二:block如果沒有參數(shù),可以省略()
// void(^)()void(^block2)() = ^{};
// 方式三:block定義中,返回值可以省略
// 類型:int(^)()int(^block3)() = ^int{return 2;};
//在Xcode中的快捷鍵是inline
  • Block類型
    • 是對(duì)象
  • Block作用
    • 保存代碼塊
    • Block:在一個(gè)類中定義,在另一個(gè)類中調(diào)用(常用), -> 傳值
//在A類中定義一個(gè)block屬性
@property (nonatomic ,strong) void(^block)();
//在B類中賦值
// 打電話
CellItem *item = [[CellItem alloc] init];
item.title = @"打電話";
item.block = ^{NSLog(@"打電話");};
//在B類方法中使用
if (item.block) {item.block();}
  • 傳值:A -> B 順傳:定義屬性;B -> A 逆?zhèn)?代理(block替換代理)
//為了替代代理
//在B類中聲明block屬性
@property (nonatomic ,strong) void(^valueBlock)(NSString *value);
//同時(shí)在B類中使用,把值傳遞出去
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
  if (_valueBlock) {
    _valueBlock(@"123");
  }
}
//在A類中定義block(首先拿到B類就能拿到B類傳出去的值)
ModalViewController *modalVc = [[ModalViewController alloc] init];
modalVc.valueBlock = ^(NSString *value){
  NSLog(@"接收到%@",value);
};

block的變量傳遞

  • 默認(rèn)局部變量在block中 是值傳遞
  • 如果局部變量被static,__block,那么都是指針傳遞
  • 全局變量.也是指針傳遞

block作為參數(shù)使用

// 計(jì)算
- (void)calculate:(int(^)(int))block;
//實(shí)現(xiàn)方法(把值傳遞出去)
- (void)calculate:(int (^)(int))block{
  _result = block(_result);
}
//在另一個(gè)類中定義
CalculateManager *mgr = [[CalculateManager alloc] init];
[mgr calculate:^(int result){
// 計(jì)算
result += 5;
result *= 2;
return result;
}];

block做為方法的返回值

//聲明方法
- (CalculateManager *(^)(int))add;
//實(shí)現(xiàn)方法(此方法可以實(shí)現(xiàn)鏈?zhǔn)近c(diǎn)語法)
- (CalculateManager *(^)(int))add{return ^(int value){
_result += value;
return self;
};
}
CalculateManager *mgr = [[CalculateManager alloc] init];
mgr.add(5).add(5).add(5).add(5);

block內(nèi)存管理:

  • 非ARC環(huán)境:block怎么去管理內(nèi)存
    • block沒有訪問外部局部變量,存放到全局區(qū)
    • block訪問外部局部變量,block存放棧里面
    • 只要block訪問變量,是整個(gè)app都在的變量,那么肯定在全局區(qū)
    • 在非ARC中.不能使用retain引用block,不會(huì)把放在堆里面,在非ARC中只能使用copy,才會(huì)把block放在堆里面
  • ARC環(huán)境:
    • block訪問外部局部變量,block存放堆里面
    • 可以使用strong去引用
    • 補(bǔ)充:內(nèi)存五大區(qū):堆,棧,方法區(qū),全局區(qū),常量區(qū)
    • 堆:手動(dòng)管理內(nèi)存
    • 棧:不需要手動(dòng)管理內(nèi)容,代碼塊一過,會(huì)自動(dòng)清空棧里面內(nèi)存
  • 如何判斷非ARC環(huán)境:
    • 重寫dealloc,調(diào)用super,ARC中不能調(diào)用[super dealloc]
    • 判斷下是否可以調(diào)用retain,release等等
  • 非ARC開發(fā)中注意:
    • 訪問屬性,不要直接使用_,而是通過set,get方法去訪問
    • 非ARC中沒有weak -> assign,strong -> retain

通過寫數(shù)據(jù)到沙盒保存數(shù)據(jù),再取數(shù)據(jù)(NSUserDefaults)

單例

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容